home *** CD-ROM | disk | FTP | other *** search
/ DS-CD ROM 2 1993 August / DS CD-ROM 2.Ausgabe (August 1993).iso / programm / ds0256 / mdebug22.exe / DRIVER.PRT < prev    next >
Text File  |  1992-11-21  |  152KB  |  4,441 lines

  1.     ───────────────────────────────────────────────────────────────────
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.                                  MDEBUG
  10.  
  11.                              Version V2.05
  12.  
  13.                  Highperformance Debugging Tool für PCs
  14.  
  15.          Dokumentation für die Kommando- und Bildschirmtreiber
  16.                                von MDEBUG
  17.  
  18.                            Copyright 1992 by
  19.                              Bernd Schemmer
  20.                           All Rights reserved.
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.     ───────────────────────────────────────────────────────────────────
  64.     Credits
  65.  
  66.     MDEBUG wurde geschrieben von Bernd Schemmer.
  67.  
  68.     Die  Kommandotreiber MDDISDRV,  MDHISDRV und MDBSPDRV und die Bild-
  69.     schirmtreiber  MDHGCDRV und  MDCGADRV wurden  geschrieben von Bernd
  70.     Schemmer.
  71.  
  72.  
  73.     ───────────────────────────────────────────────────────────────────
  74.     Copyright
  75.  
  76.     MDEBUG ist Copyright 1992 by Bernd Schemmer
  77.  
  78.     Alle Bildschirm- und Kommandotreiber auf dieser Diskette sind
  79.     Copyright 1992 by Bernd Schemer
  80.  
  81.     Dieses Dokument ist Copyright 1992 by Bernd Schemmer
  82.  
  83.  
  84.     ───────────────────────────────────────────────────────────────────
  85.     Eingetragene Warenzeichen, Warennamen
  86.  
  87.     Warenamen und eingetragene Warenzeichen werden in diesem Text ohne
  88.     Gewährleistung einer freien Verwendung benutzt.
  89.  
  90.     Alle  benutzten  Warenanamen  und  eingetragenen Warenzeichen sind
  91.     Eigentum ihrer jeweiligen Besitzer.
  92.  
  93.  
  94.     ───────────────────────────────────────────────────────────────────
  95.     Granatie-Ausschluß-Erklärung
  96.  
  97.  
  98.     Bernd Schemmer  gibt keine  Garantien irgendeiner  Art,  weder aus-
  99.     drücklich noch implizit, einschliesslich unbegrenzt aller Garantien
  100.     der  Verwendbarkeit  und/oder  Nichtverwendbarkeit  für irgendeinen
  101.     Zweck.  Bernd Schemmer  übernimmt  keine  Verpflichtungen  für  den
  102.     Gebrauchswert dieser Software  über den  Kaufpreis  dieser Software
  103.     hinaus.  Unter  keinen  Umständen  ist  Bernd Schemmer haftbar  für
  104.     jedwede Folgeschäden, einschliesslich aller entgangenen Gewinne und
  105.     Vermögensverluste,  oder  anderer   mittelbarer  und  unmittelbarer
  106.     Schäden,  die  durch  den  Gebrauch  oder  die  Nichtverwendbarkeit
  107.     dieser Software  und ihrer  begleitenden  Dokumentation  entstehen.
  108.     Dies gilt  auch  dann,  wenn  Bernd Schemmer  über die  Möglichkeit
  109.     solcher Schäden unterrichtet war oder ist.
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.     ───────────────────────────────────────────────────────────────────
  120.  
  121.  
  122.  
  123.  
  124.  
  125.     Inhalt                                                 Seite
  126.     ────────────────────────────────────────────────────────────
  127.  
  128.  
  129.     Einleitung ...........................................     1
  130.     Allgemeine Parameter für die Treiber .................     2
  131.       /Pnn - Festlegen der Prozessnummer des Treibers ....     2
  132.       /I - Ändern der Voreinstellungen ...................     2
  133.       /R - Freigabe des Treibers .........................     3
  134.       /? - Ausgabe der Aufrufsyntax ......................     3
  135.       @ - Kommentareinleitung ............................     4
  136.     Syntax der Parameter .................................     4
  137.     MDCGADRV.COM .........................................     5
  138.     MDHGCDRV.COM .........................................     6
  139.     MDHISDRV.COM .........................................     7
  140.       Parameter für MDHISDRV .............................     7
  141.         /H{1|0} - Benutzung der UMBs einstellen ..........     7
  142.         /Bnn   - festlegen der Puffergröße ...............     7
  143.       Funktionen für den Interpreter .....................     7
  144.       Tastenbelegung im Interpreter ......................     8
  145.       Befehle für den Interpreter ........................     9
  146.       Einrichten von Macro-Befehlen ......................    13
  147.     MDDISDRV.COM .........................................    14
  148.       Installieren des Disassemblers .....................    14
  149.       Parameter für MDDISDRV .............................    14
  150.         /Dn,m - Drucker ändern ...........................    14
  151.         /Lnn - Startzeile ändern .........................    15
  152.         /Fn{,}mm - Farben ändern .........................    15
  153.         /Assss:oooo - Start-Adresse ändern  ..............    16
  154.         /Sswitches - Schalter ändern .....................    16
  155.         /H{1|0} - Benutzung der UMBs einstellen ..........    18
  156.         *{!}name - Sichern des Status des Disassemblers ..    18
  157.         &name - Laden des Status des Disassemblers .......    19
  158.         /Qn - Quiet-Modus ein/ausschalten ................    19
  159.         # - Ausgabe der Codes der Funktionstasten ........    19
  160.       Aufruf des Disassemblers in MDEBUG .................    20
  161.       Aufruf des Disassemblers im Monitor von MDEBUG .....    20
  162.       Aufruf des Disassemblers im Interpreter von MDEBUG .    20
  163.       Aufruf des Disassemblers durch Befehle in MDEBUG ...    21
  164.       Weitere Befehle des Disassemblers für MDEBUG .......    21
  165.       Bedienung des Disassemblers ........................    22
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.     ────────────────────────────────────────────────────────────────────────────────
  180.     Inhalts-Verzeichnis                                                     I    1
  181.  
  182.  
  183.  
  184.  
  185.     Inhalt                                                 Seite
  186.     ────────────────────────────────────────────────────────────
  187.  
  188.  
  189.         Aufbau der Windows ...............................    22
  190.         Aufbau des Windows im Disassembler-Modus .........    22
  191.         Aufbau des Windows im Assembler-Modus ............    27
  192.         Aufbau des Windows im Dump-Modus .................    28
  193.         Tastenbelegung des Disassemblers .................    30
  194.         Suchen von Referenzen ............................    35
  195.         Benutzung des Adressen-Stacks ....................    36
  196.         Die Funktion 'Folge dem Befehl' ..................    37
  197.       Die Schalter des Disassemblers .....................    40
  198.         Anzeige-Modi für Offsets und Displacements .......    40
  199.         Der Schalter B ...................................    41
  200.         Der Schalter P ...................................    41
  201.         Der Schalter U ...................................    42
  202.         Der Schalter R ...................................    42
  203.         Der Schalter W ...................................    42
  204.         Der Schalter A ...................................    42
  205.         Der Schalter F ...................................    42
  206.         Der Schalter L ...................................    43
  207.         Der Schalter K ...................................    44
  208.         Der Schalter Q ...................................    44
  209.       Sichern von Speicherbereichen ......................    45
  210.         Allgemeines zum Sichern von Speicherbereichen ....    45
  211.         Sichern von Speicherbereichen in eine Datei ......    47
  212.         Erstellen von Quelldateien für den A86 ...........    48
  213.         Ausgabe von Speicherbereichen auf den Drucker ....    50
  214.       Zusammenfassung der Tastenbelegung im Disassembler .    51
  215.       Syntax für die Anzeige der Befehle .................    54
  216.         Mnemonics für die Opcodes des 80386 ..............    55
  217.         Ausgabe von ESC-Befehlen .........................    56
  218.         Behandlung von unbekannten Opcodes ...............    57
  219.         Opcodes mit unmöglichen Operanden ................    58
  220.         Format von expliziten Werten .....................    59
  221.         Format von Speicheroperanden .....................    59
  222.     MDBSPDRV.COM .........................................    60
  223.       Befehle für den Interpreter ........................    60
  224.       Tastenbelegung im Monitor ..........................    62
  225.       Tastenbelegung im Interpreter ......................    63
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.     ────────────────────────────────────────────────────────────────────────────────
  240.     Inhalts-Verzeichnis                                                     I    2
  241.  
  242.  
  243.  
  244.  
  245.     Inhalt                                                 Seite
  246.     ────────────────────────────────────────────────────────────
  247.  
  248.  
  249.     Programm-Interna der Treiber .........................    64
  250.     Errorlevel der Treiber ...............................    65
  251.     Fehlermeldungen des transienten Teils der Treiber ....    66
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.  
  299.     ────────────────────────────────────────────────────────────────────────────────
  300.     Inhalts-Verzeichnis                                                     I    3
  301.  
  302.  
  303.  
  304.     Einleitung
  305.     ──────────
  306.  
  307.     Diese Datei enthält die Beschreibungen der zusätzlich zu MDEBUG
  308.     mitgelieferten Bildschirm- und Kommandotreiber.
  309.  
  310.     Im einzelnen sind dies die Bildschirmtreiber
  311.  
  312.  
  313.     MDCGADRV - Bildschirmtreiber für eine CGA-Karte
  314.  
  315.     MDHGCDRV - Bildschirmtreiber für eine HGC-Karte
  316.  
  317.  
  318.     und die Kommandotreiber
  319.  
  320.  
  321.     MDHISDRV - Kommandotreiber mit einer Historyfunktion für MDEBUG
  322.  
  323.     MDDISDRV - Kommandotreiber mit einem Disassembler für MDEBUG
  324.  
  325.     MDBSPDRV - Kommandotreiber  mit  verschiedenen  neuen Tasten-
  326.                belegungen und Interpreter-Befehlen für MDEBUG.
  327.  
  328.  
  329.     Da verschiedene Aspekte (mehrere Parameter, Syntax der Parameter,
  330.     Interna, Errorlevel  und mehrere  Fehlermeldungen des transienten
  331.     Teils der Treiber)  bei  allen  Treibern  gleich sind, sind diese
  332.     Informationen nur einmal angeführt.
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356.  
  357.  
  358.  
  359.     ────────────────────────────────────────────────────────────────────────────────
  360.                                                                         Seite    1
  361.  
  362.  
  363.  
  364.     Allgemeine Parameter für die Treiber
  365.     ────────────────────────────────────
  366.  
  367.     Hinweis:  Alle Angaben  in geschweiften  Klammern ( {..} ) in den
  368.               folgenden Beschreibungen sind optional.
  369.  
  370.  
  371.     Die folgenden Parameter sind bei allen Treibern möglich:
  372.  
  373.          {/Pnn} {/I} {/R} {{/}?} {@ kommentar}
  374.  
  375.     Beschreibung der Parameter:
  376.  
  377.  
  378.     /Pnn - Festlegen der Prozessnummer des Treibers
  379.  
  380.     Mit dem Parameter '/Pnn' kann die Prozessnummer des Treibers  für
  381.     die Kommunikation mit MDEBUG  festgelegt werden.  MDEBUG kommuni-
  382.     ziert mit den Treibern  über den  Multiplex-Interrupt 2Fh und der
  383.     angegebenen Prozessnummer.
  384.  
  385.     'nn' muß ein hexadezimaler Wert zwischen 0C0h und 0FEh (für Bild-
  386.     schirmtreiber) oder 0C1h und 0FFh (für Kommandotreiber) sein.
  387.     Voreinstellung für 'nn'  ist  bei Bildschirmtreibern 0D0h und bei
  388.     Kommandotreibern 0D1h. Die Prozessnummer  muß mit  der von MDEBUG
  389.     verwendeten Prozessnummer übereinstimmen!
  390.  
  391.  
  392.     /I - Ändern der Voreinstellungen
  393.  
  394.     Durch den  Parameter '/I'  kann eine  neue Version eines Treibers
  395.     erstellt werden.
  396.     Alle  zusätzlich zu diesem Parameter  angegebenen Parameter  (vor
  397.     oder hinter  dem Parameter '/I') werden als neue Voreinstellungen
  398.     in die neue Version des Treibers eingetragen.
  399.     Der Parameter '/R' wird dabei ignoriert.
  400.  
  401.     Die neue  Version des Treibers wird immer im  aktuellem Directory
  402.     erstellt. Falls dort schon eine Datei mit dem Namen  des Treibers
  403.     existiert,  wird deren  Extension in '.BAK' geändert.  Eine evtl.
  404.     schon vorhandene Datei mit den Namen des Treibers und  der Exten-
  405.     sion '.BAK' wird in jedem Fall gelöscht.
  406.  
  407.     Bei  der Erstellung  der neuen  Version werden alle Fehler (incl.
  408.     Hardware-Fehler)  abgefangen.  Eine  nur  teilweise  geschriebene
  409.     Datei wird aber nicht gelöscht.
  410.  
  411.  
  412.  
  413.  
  414.  
  415.  
  416.  
  417.  
  418.  
  419.     ────────────────────────────────────────────────────────────────────────────────
  420.                                                                         Seite    2
  421.  
  422.  
  423.  
  424.     Nach der Bearbeitung des Parameters '/I' wird das Programm sofort
  425.     beendet.
  426.  
  427.     Beispiel:
  428.  
  429.          MDCGADRV /I /PD4
  430.  
  431.     Erstellt eine neue Version des Treibers MDCGADRV.COM bei der  als
  432.     Voreinstellung für die Prozessnummer 0D4h vorgesehen ist.
  433.  
  434.     Beim Aufruf der neuen Version des Treibers können  die geänderten
  435.     Voreinstellungen  aber selbstverständlich  wieder durch Parameter
  436.     überschrieben werden.
  437.  
  438.     Hinweis:
  439.  
  440.     Im Gegensatz zum  Parameter 'MAKE'  von MDEBUG ist  der Parameter
  441.     '/I' der Treiber auch schon in der Shareware-Version möglich.
  442.  
  443.  
  444.     /R - Freigabe des Treibers
  445.  
  446.     Durch den  Aufruf eines Treibers mit den Parameter '/R' kann eine
  447.     residente  Version des Treibers wieder aus dem  Speicher entfernt
  448.     werden.
  449.     Vorraussetzung dafür ist, daß  der Treiber das letzte Programm in
  450.     der Kette  für  den  Interrupt 2Fh (und evtl. zusätzlich belegter
  451.     Interrupts) ist. Ist  dies nicht der Fall, wird  nur eine Fehler-
  452.     meldung  ausgegeben  und der  Treiber nicht aus dem Speicher ent-
  453.     fernt.
  454.  
  455.  
  456.     /? - Ausgabe der Aufrufsyntax
  457.  
  458.     Die  Angabe des  Parameters '/?' oder '?'  veranlasst die Treiber
  459.     zur Ausgabe eines Hilfstextes mit der  Syntax für den  Aufruf und
  460.     den Voreinstellungen für die Parameter.
  461.  
  462.     Falls der Treiber über den Parameter '/I' neu konfiguriert wurde,
  463.     werden im Hilfstext selbstverständlich die geänderten Voreinstel-
  464.     lungen angezeigt.
  465.  
  466.     Eventuell  zusätzlich  zu  diesem  Parameter angegebene Parameter
  467.     werden im  Hilfstext als Voreinstellungen für  die Parameter aus-
  468.     gegeben. D.h.  die  eigentlichen  Voreinstellungen  der Parameter
  469.     werden  durch  die Angaben überschrieben.   Nach  der Ausgabe des
  470.     Hilfstextes wird das Programm sofort beendet.
  471.     Der Parameter '?' hat die höchste Priorität aller Parameter.
  472.  
  473.  
  474.  
  475.  
  476.  
  477.  
  478.  
  479.     ────────────────────────────────────────────────────────────────────────────────
  480.                                                                         Seite    3
  481.  
  482.  
  483.  
  484.     @ - Kommentareinleitung
  485.  
  486.     Der Parameter '@' leitet Kommentare ein, d.h. alle weiteren Para-
  487.     meter werden von den Treibern ignoriert.  Das bedeutet auch,  daß
  488.     das Zeichen '@' in keinem anderen Parameter vorkommen darf!
  489.     Der Parameter dient  hauptsächlich zur  Einfügung von Kommentaren
  490.     in Batch-Dateien.
  491.  
  492.  
  493.     Syntax der Parameter
  494.     ────────────────────
  495.  
  496.     Alle Parameter sind optional.
  497.  
  498.     Die Parameter können in beliebiger Reihenfolge  angegeben werden;
  499.     Groß- und Kleinschreibung ist ebenfalls beliebig.
  500.     Als Trennzeichen für die Parameter können die Zeichen '/' und '-'
  501.     verwendet  werden. Die Parameter  sollten  zusätzlich  durch min-
  502.     destens ein Leerzeichen oder Tabulatorzeichen getrennt werden.
  503.     Bei  mehrmals angegebenen  oder  sich  ausschließenden Parametern
  504.     wird der zuletzt angegebene Parameter benutzt.
  505.     Fehlerhafte Parameter  führen zur Ausgabe einer Fehlermeldung und
  506.     zum Abbruch der Programmausführung.
  507.  
  508.     Alle  Parameter,  mit Ausnahme des Parameters '/R', werden, falls
  509.     nichts  anderes angegeben  ist, nur  beim Aufruf zum Installieren
  510.     der Treiber berücksichtigt.
  511.     Bei der Deinstallation  werden alle zusätzlich zum Parameter '/R'
  512.     angegebenen  Parameter nur  auf die  Syntax überprüft  aber nicht
  513.     weiter bearbeitet.
  514.  
  515.     Jeder Treiber kann vor oder nach MDEBUG  geladen werden, falls er
  516.     deinstalliert  werden soll  muß  er  das letzte  Programm  in der
  517.     Kette für  den Interrupt 2Fh  (und evtl. weiterer belegter Inter-
  518.     rupts) sein.
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534.  
  535.  
  536.  
  537.  
  538.  
  539.     ────────────────────────────────────────────────────────────────────────────────
  540.                                                                         Seite    4
  541.  
  542.  
  543.  
  544.     MDCGADRV.COM
  545.     ────────────
  546.  
  547.     MDCGADRV.COM  ist  ein Bildschirmtreiber für MDEBUG. MDCGADRV.COM
  548.     erlaubt  den Aufruf  von MDEBUG auch in den  Graphik-Modi und den
  549.     Modi mit 40 Zeichen pro Zeile einer CGA-Karte.
  550.  
  551.     Aufruf: MDCGADRV {/Pnn} {/I} {/R} {/?} {@...}
  552.  
  553.     Parameter: (siehe 'Allgemeine Parameter für die Treiber')
  554.  
  555.  
  556.     Falls der Treiber geladen ist,  kann  MDEBUG in  allen  Modi  der
  557.     normalen  CGA-Karte (also auch im  Graphik-Modus  und in den Modi
  558.     mit 40 Zeichen pro Zeile) aufgerufen werden.
  559.  
  560.     Der Treiber  verwendet fast  ausschließlich Aufrufe des Interrupt
  561.     10h zum Ermitteln und Setzen der Bildschirmmodi.
  562.  
  563.     Ausnahme:
  564.  
  565.     Der Inhalt der Register 03D8h und 03D9h wird direkt aus der BIOS-
  566.     Data-Area ermittelt und direkt über OUT-Befehle gesetzt.
  567.  
  568.     Auf manchen CGA-Karten verbusselt der  Treiber die  Bedeutung des
  569.     7. Bits (Intensity- oder Blink-Bit) oder ändert die Farbpalette.
  570.     Der Grund  dieses Fehlers ist mir noch nich bekannt, Besitzer der
  571.     Vollversion können dieses  Manko aber speziell für ihre CGA-Karte
  572.     im Quelltext des Treibers beseitigen.
  573.     Bei älteren  Spielen  und  Programmen, die direkt  die  CGA-Karte
  574.     programmieren, versagt der Treiber.
  575.  
  576.  
  577.  
  578.  
  579.  
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  
  595.  
  596.  
  597.  
  598.  
  599.     ────────────────────────────────────────────────────────────────────────────────
  600.                                                                         Seite    5
  601.  
  602.  
  603.  
  604.     MDHGCDRV.COM
  605.     ────────────
  606.  
  607.     MDHGCDRV.COM ist ein Bildschirmtreiber für  MDEBUG.  MDHGCDRV.COM
  608.     erlaubt den Aufruf von MDEBUG auch im  Graphikmodus der Hercules-
  609.     Karte.
  610.  
  611.     Aufruf: MDHGCDRV {/Pnn} {/I} {/R} {/?} {@...}
  612.  
  613.     Parameter: (siehe 'Allgemeine Parameter für die Treiber')
  614.  
  615.  
  616.     Falls  der  Treiber geladen  ist,  kann MDEBUG  in allen Modi der
  617.     normalen HGC-Karte aufgerufen werden.
  618.  
  619.     Der  Treiber überprüft den  aktuellen  Modus  der Karte  über das
  620.     Lightpen-Register.  Der  Graphikmodus  und  der Textmodus  werden
  621.     durch  direkte Programmierung der Register 3B4h, 3B5h, 3B8h, 3B9h
  622.     und 3BFh des CRT-Controllers eingeschaltet.
  623.  
  624.     Die  Register  des CRT-Controllers  werden  vom  Treiber  für die
  625.     beiden Modi folgendermaßen programmiert:
  626.  
  627.     ┌──────────┬─────────┬──────┐ ┌──────────┬─────────┬───────┐
  628.     │Controller│ Graphik │ Text │ │          │ Graphik │  Text │
  629.     │Register  │  Mode   │ Mode │ │ Register │   Mode  │  Mode │
  630.     ╞══════════╪═════════╪══════╡ ╞══════════╪═════════╪═══════╡
  631.     │  00h     │   36h   │ 61h  │ │  03B8h   │   29h   │  0Ah  │
  632.     │  01h     │   2Dh   │ 50h  │ ├──────────┼─────────┼───────┤
  633.     │  02h     │   2Fh   │ 52h  │ │  03B9h   │   30h   │  30h  │
  634.     │  03h     │   07h   │ 0Fh  │ ├──────────┼─────────┼───────┤
  635.     │  04h     │   5Bh   │ 19h  │ │  03BFh   │   00h   │  03h  │
  636.     │  05h     │   00h   │ 06h  │ └──────────┴─────────┴───────┘
  637.     │  06h     │   57h   │ 19h  │
  638.     │  07h     │   57h   │ 19h  │ Die Angaben wurde der Dokumentation
  639.     │  08h     │   02h   │ 02h  │ zur  Graphik-Karte 'ATI-Solution 1'
  640.     │  09h     │   03h   │ 0Dh  │ entnommen. Es kann sein, daß  diese
  641.     │  0Ah     │   00h   │ 0Bh  │ Werte nicht  mit denen von  anderen
  642.     │  0Bh     │   00h   │ 0Ch  │ HGC-Karten übereinstimmen. Besitzer
  643.     │  0Ch     │   00h   │ 00h  │ der  Vollversion können  diese aber
  644.     │  0Dh     │   00h   │ 00h  │ im Quellcode  des  Treibers  korri-
  645.     └──────────┴─────────┴──────┘ gieren.
  646.  
  647.     Hinweis:
  648.  
  649.     Bei  älteren Spielen  und  Programmen,  die  direkt die HGC-Karte
  650.     programmieren, versagt der Treiber.
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.     ────────────────────────────────────────────────────────────────────────────────
  660.                                                                         Seite    6
  661.  
  662.  
  663.  
  664.     MDHISDRV.COM
  665.     ────────────
  666.  
  667.     MDHISDRV.COM ist ein  Kommandotreiber  für  MDEBUG.  MDHISDRV.COM
  668.     stellt eine History-Funktion für MDEBUG zur Verfügung.
  669.  
  670.     Aufruf: MDHISDRV {/H{1|0}} {/Bnn} {/Pnn} {/I} {/R} {/?} {@...}
  671.  
  672.     Parameter für MDHISDRV
  673.     (siehe auch 'Allgemeine Parameter für die Treiber')
  674.  
  675.  
  676.     /H{1|0} - Benutzung der UMBs einstellen
  677.  
  678.     Mit  diesem  Parameter kann  festgelegt werden,  ob der residente
  679.     Teil von  MDHISDRV  in einen  Speicherbereich  oberhalb von A000h
  680.     verschoben werden soll (n = 1) oder nicht (n = 0). Voreinstellung
  681.     für n ist 0. Falls der Parameter in der Form '/H' angegeben wird,
  682.     wird der  aktuelle Wert  von n  umgeschaltet. Falls der Parameter
  683.     '/H1' angegeben  wird,  und  kein  freier Speicherbereich  in der
  684.     benötigten Größe oberhalb von A000h vorhanden ist (z.B.  bei DOS-
  685.     Versionen  vor 5.00 ohne  speziellen  Speichermanager  oder falls
  686.     alle  Blöcke  oberhalb  von A000h  schon  belegt sind),  wird der
  687.     residente Teil  von MDHISDRV  im  Speicherbereich  unterhalb  von
  688.     A000h belassen.
  689.     Der Parameter  wird nur bei der Installation des Treibers berück-
  690.     sichtigt.
  691.  
  692.  
  693.     /Bnn   - festlegen der Puffergröße
  694.  
  695.     'nn' ist die Größe des Puffers für die History-Funktion in Byte
  696.     (dez., Intervall: 128..max, Voreinst.: 512)
  697.  
  698.     Der maximal  mögliche Wert für  diesen  Parameter ergibt sich aus
  699.     der Größe des freien Speichers bei der Installation des Treibers.
  700.     (maximal ca. 60.000)
  701.  
  702.  
  703.     Funktionen für den Interpreter
  704.     ──────────────────────────────
  705.  
  706.     Der Treiber stellt eine  History-Funktion für den Interpreter von
  707.     MDEBUG zur Verfügung,  d.h. nach dem MDHISDRV geladen  ist können
  708.     die letzten Befehlszeilen  jeweils  aus einem  Puffer restauriert
  709.     werden. Die  Anzahl  der  Befehlszeilen,  die  restauriert werden
  710.     können, richtet sich nach der Größe  des  eingerichteten  Puffers
  711.     und nach der Länge der  Befehlszeilen.  Der Puffer zum  Speichern
  712.     der Befehlszeilen ist als Ringpuffer organisiert,  d.h. falls der
  713.     Puffer  voll ist  werden die Befehlszeilen am Anfang  des Puffers
  714.     mit den nächsten Befehlszeilen überschrieben.
  715.  
  716.  
  717.  
  718.  
  719.     ────────────────────────────────────────────────────────────────────────────────
  720.                                                                         Seite    7
  721.  
  722.  
  723.  
  724.     Tastenbelegung im Interpreter
  725.     ─────────────────────────────
  726.  
  727.     Der  Treiber sichert alle  Befehlszeilen,  die mit <RETURN> abge-
  728.     schlossen wurden. Befehlszeilen,  die  mit  <ALT-RETURN>  beendet
  729.     wurden, werden nicht gesichert.  Eingaben, die über <CTRL-RETURN>
  730.     nochmals  bearbeitet wurden, werden  kein zweitesmal gespeichert.
  731.     Es werden  nur Befehlszeilen mit mehr als einem Zeichen gesichert
  732.     (wobei Leerzeichen nicht zählen).
  733.  
  734.     Zur Verwaltung des Puffers belegt  der Treiber folgende Tasten im
  735.     Interpreter:
  736.  
  737.     <CTRL-R>   - History-Funktion einschalten
  738.  
  739.     Der Treiber sichert die Befehlszeilen nur, falls er eingeschaltet
  740.     ist. (Voreinstellung)
  741.  
  742.  
  743.     <CTRL-V>   - History-Funktion ausschalten
  744.  
  745.     Die Befehlszeilen werden nicht  mehr gesichert. (bis zum nächsten
  746.     Einschalten der History-Funktion)  Das  Restaurieren von Befehls-
  747.     zeilen über  die Tasten  <CTRL-E> und <CTRL-X> funktioniert  aber
  748.     auch bei ausgeschalteter History-Funktion.
  749.  
  750.  
  751.     <CTRL-E>
  752.     <CTRL-X>   - Mit diesen Tasten kann  eine gesicherte Befehlszeile
  753.                  aus dem Puffer gewählt werden.
  754.  
  755.     Hinweis:
  756.  
  757.     Der  letzte Befehl  muß  entweder  über die  Taste <SHIFT-RETURN>
  758.     oder über die Tastenfolge <CTRL-E><CTRL-X> restauriert werden.
  759.  
  760.     Der Treiber gibt  einen Fehlerton aus falls  es keinen vorherigen
  761.     oder nächsten Befehl im Puffer mehr gibt. Falls der Treiber einen
  762.     Fehler in  der  Pufferverwaltung  feststellt,  wird  der  gesamte
  763.     Puffer gelöscht. (z.B. nach dem Laden einer neuen Datei, s.u.)
  764.  
  765.     Befehlszeilen,  die über die Tasten <CTRL-E> und <CTRL-X> restau-
  766.     riert wurden, werden kein  zweitesmal  gesichert  (falls sie nicht
  767.     vor der erneuten Ausführung editiert werden).
  768.  
  769.  
  770.     <CTRL-D>   - gesamten Puffer der History-Funktion löschen
  771.  
  772.     Der Puffer wird  nur gelöscht,  falls  die  History-Funktion ein-
  773.     geschaltet ist.
  774.  
  775.  
  776.  
  777.  
  778.  
  779.     ────────────────────────────────────────────────────────────────────────────────
  780.                                                                         Seite    8
  781.  
  782.  
  783.  
  784.     Zusätzlich  stellt der Treiber MDHISDRV  noch 10 Einzelpuffer für
  785.     jeweils eine Befehlszeile zur Verfügung.
  786.  
  787.     Die Befehlszeilen in den Einzelpuffern  können über die folgenden
  788.     Tasten ausgeführt werden:
  789.  
  790.     <ALT><0>   (Tastencode: 8100h)  --  Einzelpuffer 0
  791.     <ALT><1>   (Tastencode: 7800h)  --  Einzelpuffer 1
  792.     <ALT><2>   (Tastencode: 7900h)  --  Einzelpuffer 2
  793.     ...
  794.     <ALT><9>   (Tastencode: 8000h)  --  Einzelpuffer 9
  795.  
  796.     Die  Befehlszeile wird sofort  ausgeführt!  Falls  die  sofortige
  797.     Ausführung  verhindert werden soll, kann als erster Befehl in der
  798.     Befehlszeile ein ungültiger Befehlsname angegeben werden.
  799.  
  800.     <0> bis <9> sind die Ziffern aus der obersten Reihe der Tastatur.
  801.     Falls  der gewählte Einzelpuffer  leer ist,  gibt der Treiber die
  802.     Taste an den nächsten Treiber weiter bzw. an MDEBUG zurück.
  803.  
  804.  
  805.  
  806.     Befehle für den Interpreter
  807.     ───────────────────────────
  808.  
  809.     Zusätzlich stellt der Treiber folgende neue Befehle zur Verfügung
  810.     (signifikant ist jeweils nur das erste und das letzte Zeichen der
  811.      Befehle):
  812.  
  813.  
  814.     W{RITE}B {dateiname}
  815.  
  816.     Dieser Befehl schreibt  den Inhalt und die  Daten des Puffers der
  817.     History-Funktion  und die Inhalte der  Einzelpuffer (s.u.) in die
  818.     Datei 'dateiname'.  Eine schon existierende Datei wird dabei ohne
  819.     Warnung überschrieben.
  820.     Die Voreinstellung für den Dateinamen ist 'MDHISDRV.BUF'.
  821.  
  822.  
  823.     R{EAD}B {dateiname}
  824.  
  825.     Der  Befehl  RB liest  den Inhalt und  die Daten des  Puffers der
  826.     History-Funktion und die Inhalte der  Einzelpuffer (s.u.) aus der
  827.     Datei 'dateiname'. Falls  ein  Fehler auftritt, werden der Puffer
  828.     der History-Funktion und die Einzelpuffer gelöscht.
  829.  
  830.  
  831.  
  832.  
  833.  
  834.  
  835.  
  836.  
  837.  
  838.  
  839.     ────────────────────────────────────────────────────────────────────────────────
  840.                                                                         Seite    9
  841.  
  842.  
  843.  
  844.     Falls die angegebene Datei größer  als der vorhandene Puffer ist,
  845.     wird  nur der  erste Teil  der Datei  gelesen  (die  Einzelpuffer
  846.     werden immer vollständig gelesen);  falls  die  Datei kleiner als
  847.     der vorhandene  Puffer ist wird der restliche Puffer gelöscht. Es
  848.     können nur durch den Befehl W{RITE}B geschriebene Dateien gelesen
  849.     werden. Die Voreinstellung für 'dateiname' ist 'MDHISDRV.BUF'.
  850.     Der  Befehl RB  überprüft nicht die Größe  der zu lesenden Datei.
  851.  
  852.     Die Befehle  RB und WB  können  nur  ausgeführt werden, falls DOS
  853.     nicht aktiv ist. (Da sie  den DOS-Interrupt 21h zum Schreiben und
  854.     Lesen der Dateien benutzen.) Sie zeigen das Ergebnis  als Fehler-
  855.     Meldung an (d.h. sie enden immer mit einem Fehler).
  856.     Die  Befehle zum Lesen  bzw. Schreiben  des Puffers  fangen  auch
  857.     Hardware-Fehler ab.
  858.     Sie benutzen das PSP des gerade aktiven Prozesses.
  859.  
  860.  
  861.     H{ISTORY}=
  862.  
  863.     Der  Befehl H= zeigt den  Status  der History-Funktion  (ein oder
  864.     aus) als Fehlermeldung an.
  865.  
  866.  
  867.     H{ISTORY}-
  868.  
  869.     Der Befehl H-  schaltet die  History-Funktion aus. Im Unterschied
  870.     zur Taste <CTRL-V> zeigt dieser  Befehl aber  auch  eine  Meldung
  871.     (als Fehlermeldung) an.
  872.  
  873.  
  874.     H{ISTORY}+
  875.  
  876.     Der Befehl H+  schaltet  die History-Funktion ein. Im Unterschied
  877.     zur  Taste <CTRL-R>  zeigt dieser  Befehl aber  auch eine Meldung
  878.     (als Fehlermeldung) an.
  879.  
  880.  
  881.     BS
  882.  
  883.     Dieser Befehl liefert im Register CX die Größe des eingerichteten
  884.     Puffers für die  History-Funktion und  im Register AX  die Anzahl
  885.     der belegten Bytes im Puffer für die History-Funktion.
  886.  
  887.  
  888.  
  889.  
  890.  
  891.  
  892.  
  893.  
  894.  
  895.  
  896.  
  897.  
  898.  
  899.     ────────────────────────────────────────────────────────────────────────────────
  900.                                                                         Seite   10
  901.  
  902.  
  903.  
  904.     En
  905.  
  906.     Editieren des Inhaltes des Einzelpuffers mit  der Nummer n. n muß
  907.     eine Ziffer zwischen 0 und 9 sein.
  908.     Der Treiber schreibt den Inhalt des Einzelpuffers hinter 'n: ' in
  909.     den Eingabepuffer von MDEBUG wo er dann editiert werden kann.
  910.  
  911.     Beispiel:
  912.  
  913.          E1
  914.          @ Editieren des Inhaltes des Einzelpuffers 1
  915.  
  916.     Über  den En-Befehl  lässt sich  somit auch  feststellen,  ob ein
  917.     Einzelpuffer  schon belegt  ist.  Der Befehl  löscht vor der Aus-
  918.     führung die Eingabe-Zeile von MDEBUG.
  919.  
  920.  
  921.     n: {befehlszeile}
  922.  
  923.     Übernahme der  Parameter des Befehls in den Einzelpuffer  mit der
  924.     Nummer n. n  muß  eine Ziffer  zwischen 0 und 9  sein.  Die über-
  925.     nommene Befehlszeile wird nicht weiter bearbeitet.
  926.  
  927.     Beispiel:
  928.  
  929.          4: MOV AL,4
  930.          @ Übernahme des Befehls 'MOV AL,4' in den
  931.          @ Einzelpuffer mit der Nummer 4
  932.  
  933.  
  934.     Ln
  935.  
  936.     Löschen  des Einzelpuffers  mit der  Nummer n.  n mß  eine Ziffer
  937.     zwischen 0 und 9 sein.
  938.  
  939.     Beispiel:
  940.  
  941.          L9
  942.          @ Löschen des Einzelpuffers mit der Nummer 9
  943.  
  944.  
  945.     LA
  946.  
  947.     Löschen aller Einzelpuffer
  948.  
  949.  
  950.  
  951.  
  952.  
  953.  
  954.  
  955.  
  956.  
  957.  
  958.  
  959.     ────────────────────────────────────────────────────────────────────────────────
  960.                                                                         Seite   11
  961.  
  962.  
  963.  
  964.     MA
  965.  
  966.     Sofortiges Ausführen des Einzelpuffers, dessen Nummer im Register
  967.     AL steht.  Ein  Wert größer  als 9 im  Register AL führt zu einem
  968.     Syntaxfehler.
  969.  
  970.  
  971.     Mn
  972.  
  973.     Sofortiges  Ausführen  des Einzelpuffers  n. n  muß  eine  Ziffer
  974.     zwischen 0 und 9 sein.
  975.  
  976.  
  977.     Bei den Befehlen 'n:' und 'En' muß  folgendes beachtet werden:
  978.  
  979.     Falls mehrere verkettete Befehle in einen Einzelpuffer übernommen
  980.     werden sollen, müssen diese durch das Zeichen ~ getrennt  werden.
  981.     Die Zeichen ~ und ^ können  nicht in einer Befehlszeile für einen
  982.     Einzelpuffer gespeichert werden.
  983.  
  984.     Beispiele:
  985.  
  986.          3: MOV AL,4 ~ MOV BL,6 ~ MOV CL,7
  987.          @ Speichern der 3 Befehle im Einzelpuffer mit der Nummer 3
  988.  
  989.          4: MOV AL,4 MOV BL,6 MOV CL,7
  990.          @ Speichern des Befehls
  991.          @ 'MOV AL,4'
  992.          @ und d. Kommentars (!)
  993.          @ 'MOV BL,6 MOV CL,7'
  994.          @ im Einzelpuffer mit der Nummer 4
  995.  
  996.          5: MOV AL,5 ^ MOV BL,6 ^ MOV CL,7
  997.          @ Speichern des Befehls
  998.          @ 'MOV AL,5'
  999.          @ im Einzelpuffer mit der Nummer 5 und
  1000.          @ sofortiges Ausführen (!) der Befehle
  1001.          @ 'MOV BL,6' und 'MOV CL,7'.
  1002.  
  1003.  
  1004.  
  1005.  
  1006.  
  1007.  
  1008.  
  1009.  
  1010.  
  1011.  
  1012.  
  1013.  
  1014.  
  1015.  
  1016.  
  1017.  
  1018.  
  1019.     ────────────────────────────────────────────────────────────────────────────────
  1020.                                                                         Seite   12
  1021.  
  1022.  
  1023.  
  1024.     Einrichten von Macro-Befehlen
  1025.     ─────────────────────────────
  1026.  
  1027.     Da der  WB-Befehl die Inhalte der Einzelpuffer mitsichert, lassen
  1028.     sich damit auch  10 zusätzliche  Tastenbelegungen, die beim Start
  1029.     automatisch geladen werden, realisieren.
  1030.  
  1031.     Beispiel:
  1032.  
  1033.     Zuerst  werden die  10  Einzelpuffer mit den gewünschten Befehls-
  1034.     zeilen  belegt.  Danach  werden die  Puffer über den WB-Befehl in
  1035.     eine Datei gesichert. z.B.
  1036.  
  1037.          WB MDAUTO.BEF
  1038.  
  1039.     Nun müssen  folgende Befehle in die  Datei AUTOEXEC.BAT eingefügt
  1040.     werden (die Kommentarzeilen natürlich nicht unbedingt):
  1041.  
  1042.          REM Zuerst MDEBUG laden ...
  1043.              MDEBUG
  1044.  
  1045.          REM ... jetzt den Treiber laden (geht auch umgekehrt) ...
  1046.              MDHISDRV
  1047.  
  1048.          REM und nun über das Util CALLMDB den Treiber zum Laden
  1049.          REM der Puffer aus der Datei veranlassen
  1050.              CALLMDB "RB MDAUTO.BEF ^M" #0 "^M"
  1051.  
  1052.          REM Der Code #0 (Simuliere leeren Tastaturpuffer) ist nötig,
  1053.          REM da der Befehl RB mit einem Fehler endet und MDEBUG daher
  1054.          REM den Tastaturpuffer leert so daß die restlichen Parameter
  1055.          REM von CALLMDB ignoriert würden.
  1056.          REM Das Passwort sollte ausgeschaltet sein, es kann aber
  1057.          REM durch den Code der Taste <F3> (#3D00) hinter oder vor
  1058.          REM den Parametern über CALLMDB eingeschaltet werden.
  1059.  
  1060.  
  1061.  
  1062.  
  1063.  
  1064.  
  1065.  
  1066.  
  1067.  
  1068.  
  1069.  
  1070.  
  1071.  
  1072.  
  1073.  
  1074.  
  1075.  
  1076.  
  1077.  
  1078.  
  1079.     ────────────────────────────────────────────────────────────────────────────────
  1080.                                                                         Seite   13
  1081.  
  1082.  
  1083.  
  1084.     MDDISDRV.COM
  1085.     ────────────
  1086.  
  1087.     MDDISDRV.COM  ist  ein  Kommandotreiber für MDEBUG.  MDDISDRV.COM
  1088.     stellt einen interaktiven Disassembler für MDEBUG zur  Verfügung.
  1089.  
  1090.     Der Disassembler kennt die  Opcodes  aller Prozessoren der 80x86-
  1091.     Familie von INTEL bis  einschließlich des 80386 und  die  Opcodes
  1092.     der zugehörigen  Coprozessoren 8087, 80287 und 80387.   Ebenfalls
  1093.     implementiert sind die Befehle, die nur auf dem weit verbreiteten
  1094.     Prozessor  V20 (bzw. V30)  von NEC  möglich sind (ausgenommen die
  1095.     Befehle für den 8080-Emulation-Mode).
  1096.     Nicht bzw. nur teilweise  implementiert  sind nur die  beim 80386
  1097.     vorhandenen Adress- und Operand-Size-Prefixe und die neuen Adres-
  1098.     sierungsarten des 80386, da Programme unter DOS normalerweise nur
  1099.     den 16-Bit-Modus des 80386 nutzen.
  1100.  
  1101.  
  1102.     Installieren des Disassemblers
  1103.  
  1104.     Der Disassembler kann folgendermaßen installiert werden:
  1105.  
  1106.     MDDISDRV {/D{n}{,m}} {/Lnn} {/Fn{,}mm} {/Assss:oooo} 
  1107.              {/Sswitches} {/Pnn} {/Qn} {/I} {/R} {/H{1|0}}
  1108.              {*{!}name} {&name} {?} {#} {@}
  1109.  
  1110.  
  1111.     Parameter für MDDISDRV
  1112.     (siehe auch 'Allgemeine Parameter für die Treiber')
  1113.  
  1114.     /Dn,m - Drucker ändern
  1115.  
  1116.     Mit dem Parameter '/Dn,m' kann der zu benutzende  Drucker und die
  1117.     maximale Anzahl  Zeilen  pro Seite  für  Datei- und Druckausgaben
  1118.     festgelegt werden.
  1119.  
  1120.     'n' ist die Nummer des zu verwendeten Druckers.
  1121.     'n' muß eine Ziffer im Intervall zwischen 1 und 9 sein (1 = LPT1,
  1122.     ..., 9 = LPT9).
  1123.     'm' ist  die  Anzahl der Zeilen pro Seite. 'm' kann jeder Wert im
  1124.     Intervall  zwischen 10  und 255 sein.  Die maximale Anzahl Zeilen
  1125.     pro Seite gilt für Datei- und Druckausgaben.
  1126.  
  1127.     Soll nur die Anzahl der Zeilen pro Seite geändert werden, so kann
  1128.     der Parameter auch in der Form '/D,m' angegeben werden.
  1129.     Voreinstellung für 'n' ist 1 und für 'm' 55.
  1130.  
  1131.  
  1132.  
  1133.  
  1134.  
  1135.  
  1136.  
  1137.  
  1138.  
  1139.     ────────────────────────────────────────────────────────────────────────────────
  1140.                                                                         Seite   14
  1141.  
  1142.  
  1143.  
  1144.     /Lnn - Startzeile ändern
  1145.  
  1146.     Mit dem Parameter '/Lnn' kann  die Nummer der Bildschirmzeile für
  1147.     die erste Zeile des Disassembler-Windows festgelegt werden.
  1148.  
  1149.     'nn' ist  die  (dezimale) Nummer der Bildschirmzeile und muß  ein
  1150.     Wert im Intervall zwischen 1 und 7 sein.
  1151.     Voreinstellung für 'nn' ist 2.
  1152.  
  1153.  
  1154.     /Fn{,}mm - Farben ändern
  1155.  
  1156.     Der Parameter '/Fn,mm' dient  zur Änderung  der vom  Disassembler
  1157.     verwendeten Farben für die Bildschirmausgabe.
  1158.  
  1159.     'n' ist  die Nummer  der zu  ändernden Farbe. Da der Disassembler
  1160.     nur 3 Farben  für die Ausgabe  verwendet, muß  'n' eine Ziffer im
  1161.     Intervall zwischen 1 und 3 sein.
  1162.  
  1163.     'mm'  ist die  hexadezimale  Angabe  des  Farbattributs  für  die
  1164.     angegebene Farbnummer.
  1165.  
  1166.     Das Farbattribut 'mm' ist dabei
  1167.     folgendermaßen aufgebaut:
  1168.  
  1169.     ┌────────┬────────────────────────────┐
  1170.     │ Bit(s) │ Bedeutung                  │
  1171.     ╞════════╪════════════════════════════╡
  1172.     │  0..3  │ Codierung der Vordergrund- │
  1173.     │        │ Farbe Intervall: 0..0Fh    │
  1174.     │  4..6  │ Codierung der Hintergrund- │
  1175.     │        │ Farbe Intervall: 0..07h    │
  1176.     │  7     │ Blinken ein (1) / aus (0)  │
  1177.     └────────┴────────────────────────────┘
  1178.  
  1179.     Voreingestellt sind folgende
  1180.     Farbattribute:
  1181.  
  1182.     ┌───────┬───────┬───────────────────┐
  1183.     │       │       │  Wirkung auf      │
  1184.     │ Farbe │ Attr. │ s/w-Monitoren     │
  1185.     ╞═══════╪═══════╪═══════════════════╡
  1186.     │   1   │  07h  │ grau auf schwarz  │
  1187.     │   2   │  0Fh  │ weiß auf schwarz  │
  1188.     │   3   │  70h  │ schwarz auf weiß  │
  1189.     └───────┴───────┴───────────────────┘
  1190.  
  1191.     Die  Farbnummer  und  das  Farbattribut können  durch  ein  Komma
  1192.     getrennt werden.
  1193.  
  1194.  
  1195.  
  1196.  
  1197.  
  1198.  
  1199.     ────────────────────────────────────────────────────────────────────────────────
  1200.                                                                         Seite   15
  1201.  
  1202.  
  1203.  
  1204.     /Assss:oooo - Start-Adresse ändern 
  1205.  
  1206.     Mit diesem  Parameter kann  die Start-Adresse  des  Disassemblers
  1207.     festgelegt werden.
  1208.  
  1209.     'ssss' und  'oooo'  müssen  hexadezimale Werte zwischen 0000h und
  1210.     0FFFFh sein.
  1211.     Voreinstellung für 'ssss:oooo'  ist F000h:FFF0h, also  die Start-
  1212.     Adresse des Prozessors nach einem Reset.
  1213.  
  1214.  
  1215.     /Sswitches - Schalter ändern
  1216.  
  1217.     Über den  Parameter '/Sswitches' können  die Voreinstellungen für
  1218.     verschiedene Schalter des Disassemblers geändert werden.
  1219.  
  1220.     'switches' muß  eine beliebige Kombination der folgenden Schalter
  1221.     sein:
  1222.     (die mit (*) markierten Werte sind jeweils die Voreinstellung)
  1223.  
  1224.     ┌────────┬────────────────────────────────────────────────────────┐
  1225.     │ Switch │ Bedeutung                                              │
  1226.     ╞════════╪════════════════════════════════════════════════════════╡
  1227.     │  a  (*)│ bestehende Dateien überschreiben                       │
  1228.     ├────────┼────────────────────────────────────────────────────────┤
  1229.     │  A     │ bestehende Dateien verlängern                          │
  1230.     ├────────┼────────────────────────────────────────────────────────┤
  1231.     │  F     │ Datei- und Druckausgaben formatieren                   │
  1232.     ├────────┼────────────────────────────────────────────────────────┤
  1233.     │  f  (*)│ Datei- und Druckausgaben nicht formatieren             │
  1234.     ├────────┼────────────────────────────────────────────────────────┤
  1235.     │  B  (*)│ Stackblocking ausschalten                              │
  1236.     ├────────┼────────────────────────────────────────────────────────┤
  1237.     │  b     │ Stackblocking einschalten                              │
  1238.     ├────────┼────────────────────────────────────────────────────────┤
  1239.     │  U     │ Ausgabe von unbekannten Opcodes mit einem Byte         │
  1240.     ├────────┼────────────────────────────────────────────────────────┤
  1241.     │  u  (*)│ Ausgabe von unbekannten Opcodes mit zwei Bytes         │
  1242.     ├────────┼────────────────────────────────────────────────────────┤
  1243.     │  P  (*)│ Ausgabe von Prefixen vor den Befehlen                  │
  1244.     ├────────┼────────────────────────────────────────────────────────┤
  1245.     │  p     │ Ausgabe von Prefixen als einzelne Befehle              │
  1246.     └────────┴────────────────────────────────────────────────────────┘
  1247.  
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257.  
  1258.  
  1259.     ────────────────────────────────────────────────────────────────────────────────
  1260.                                                                         Seite   16
  1261.  
  1262.  
  1263.  
  1264.     ┌────────┬────────────────────────────────────────────────────────┐
  1265.     │ Switch │ Bedeutung                                              │
  1266.     ╞════════╪════════════════════════════════════════════════════════╡
  1267.     │  W  (*)│ Ausgabe von WAIT-Befehlen ab dem 80827 als einzelne    │
  1268.     │        │ Befehle                                                │
  1269.     ├────────┼────────────────────────────────────────────────────────┤
  1270.     │  w     │ WAIT-Befehle immer als Teil des Befehls ausgeben       │
  1271.     ├────────┼────────────────────────────────────────────────────────┤
  1272.     │  R  (*)│ Anzeige im Dump-Modus kontinuierlich updaten           │
  1273.     ├────────┼────────────────────────────────────────────────────────┤
  1274.     │  r     │ Anzeige im Dump-Modus nur nach einem Tastendruck       │
  1275.     │        │ updaten                                                │
  1276.     ├────────┼────────────────────────────────────────────────────────┤
  1277.     │  K  (*)│ Kommentare ausgeben                                    │
  1278.     ├────────┼────────────────────────────────────────────────────────┤
  1279.     │  k     │ Kommentare nicht ausgeben                              │
  1280.     ├────────┼────────────────────────────────────────────────────────┤
  1281.     │ Axx    │ Modus für die Ausgabe von Offsets und Displacements    │
  1282.     │        │ festlegen, Bedeutung von 'xx':                         │
  1283.     │        │ ┌─────┬─────────┬──────────┐                           │
  1284.     │        │ │ xx  │  Code   │   Daten  │                           │
  1285.     │        │ ╞═════╪═════════╪══════════╡                           │
  1286.     │     (*)│ │ aa  │ absolut │  absolut │                           │
  1287.     │        │ │ ra  │ relativ │  absolut │                           │
  1288.     │        │ │ ar  │ absolut │  relativ │                           │
  1289.     │        │ │ rr  │ relativ │  relativ │                           │
  1290.     │        │ └─────┴─────────┴──────────┘                           │
  1291.     ├────────┼────────────────────────────────────────────────────────┤
  1292.     │ Dx     │ Anzeige-Modus festlegen, Bedeutung von 'x':            │
  1293.     │        │ ┌───┬──────────────────────┐                           │
  1294.     │        │ │ x │ Modus                │                           │
  1295.     │        │ ╞═══╪══════════════════════╡                           │
  1296.     │     (*)│ │ a │ Disassembler-Modus   │                           │
  1297.     │        │ │ A │ Assembler-Modus      │                           │
  1298.     │        │ │ D │ Dump-Modus           │                           │
  1299.     │        │ └───┴──────────────────────┘                           │
  1300.     ├────────┼────────────────────────────────────────────────────────┤
  1301.     │ Lx     │ Modus für die Ermittlung der vorherigen Instruktion    │
  1302.     │        │ festlegen, Bedeutung von 'x':                          │
  1303.     │        │ ┌───┬─────────────────────────────────────────────────┐│
  1304.     │        │ │ x │ Modus                                           ││
  1305.     │        │ ╞═══╪═════════════════════════════════════════════════╡│
  1306.     │        │ │ s │ ermittle den kürzesten Befehl                   ││
  1307.     │        │ │ l │ ermittle den längsten Befehl                    ││
  1308.     │     (*)│ │ p │ ermittle die vorherige Instruktion seitenweise  ││
  1309.     │        │ └───┴─────────────────────────────────────────────────┘│
  1310.     └────────┴────────────────────────────────────────────────────────┘
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.  
  1319.     ────────────────────────────────────────────────────────────────────────────────
  1320.                                                                         Seite   17
  1321.  
  1322.  
  1323.  
  1324.     Die Schalter können in beliebiger Reihenfolge angegeben und durch
  1325.     Kommas getrennt werden. Mehrdeutige Schalter (z.B. 'A' und 'Ara')
  1326.     müssen durch Komma getrennt werden.  Bei mehrmaliger Angabe eines
  1327.     Schalters oder bei Angabe mehrerer sich  ausschließender Schalter
  1328.     wird der  letzte angegebene Schalter benutzt. Die Schalter werden
  1329.     nur bei der Installation berücksichtigt,  sie können aber auch im
  1330.     interaktivem  Modus  des  Disassemblers  noch  beliebig  geändert
  1331.     werden. (siehe 'Die Schalter des Disassemblers')
  1332.     Bei den  Schaltern wird zwischen Groß- und Kleinschreibung unter-
  1333.     schieden!
  1334.  
  1335.  
  1336.     /H{1|0} - Benutzung der UMBs einstellen
  1337.  
  1338.     Mit  diesem  Parameter kann  festgelegt werden,  ob der residente
  1339.     Teil von  MDDISDRV  in einen  Speicherbereich  oberhalb von A000h
  1340.     verschoben werden soll (n = 1) oder nicht (n = 0). Voreinstellung
  1341.     für n ist 0. Falls der Parameter in der Form '/H' angegeben wird,
  1342.     wird der  aktuelle Wert  von n  umgeschaltet. Falls der Parameter
  1343.     '/H1' angegeben  wird,  und  kein  freier Speicherbereich  in der
  1344.     benötigten Größe oberhalb von A000h vorhanden ist (z.B.  bei DOS-
  1345.     Versionen  vor 5.00 ohne  speziellen  Speichermanager  oder falls
  1346.     alle  Blöcke  oberhalb  von A000h  schon  belegt sind),  wird der
  1347.     residente Teil  von MDDISDRV  im  Speicherbereich  unterhalb  von
  1348.     A000h belassen.
  1349.     Der Parameter  wird nur bei der Installation des Treibers berück-
  1350.     sichtigt.
  1351.  
  1352.  
  1353.     *{!}name - Sichern des Status des Disassemblers
  1354.  
  1355.     Über  diesen Parameter kann  der Status des Disassemblers in eine
  1356.     Datei gesichert werden.  'name'  ist hierbei  der Name  der Datei
  1357.     (evtl. inclusive Pfad).  Falls  vor dem  Dateinamen ein führendes
  1358.     Rufzeichen ('!')  angegeben  wird,  wird  eine  bestehende  Datei
  1359.     überschrieben. Ansonsten  führt  eine  bestehende Datei zu  einem
  1360.     Fehler.
  1361.     Falls schon eine residente Version des Disassemblers geladen ist,
  1362.     wird deren Status gesichert. Der Parameter '*name' wird in diesem
  1363.     Fall vor dem zusätzlich möglichen Parameter '/R' ausgeführt.
  1364.  
  1365.     Gesichert werden die folgenden Daten:
  1366.  
  1367.     - die aktuellen Werte der Schalter, Variablen und Modi des
  1368.       Disassemblers
  1369.     - die Start-Adresse
  1370.     - die Adressen aller Marker
  1371.     - der komplette Adressen-Stack
  1372.     - die Daten der letzten Referenz-Suche
  1373.     - die Inhalte der Segment-Register und des Registers HB
  1374.     - die Start-Zeile und die Farben des Windows
  1375.     - die aktuelle Seite der Online-Hilfe
  1376.     - die aktuellen Werte für die Taste <0>
  1377.  
  1378.  
  1379.     ────────────────────────────────────────────────────────────────────────────────
  1380.                                                                         Seite   18
  1381.  
  1382.  
  1383.  
  1384.     &name - Laden des Status des Disassemblers
  1385.  
  1386.     Mit dem Parameter '&name' kann  der Status des  Disassemblers aus
  1387.     einer  (durch  den  Parameter '*name'  erstellten)  Datei gelesen
  1388.     werden. Falls  schon eine  residente  Version  des  Disassemblers
  1389.     geladen ist, wird deren Status verändert.
  1390.     Falls  die  Parameter  '&name'  und  '*name'  zusammen  angegeben
  1391.     werden, wird immer  zuerst der Parameter  '*name' ausgeführt. Der
  1392.     Parameter  wird ebenfalls  vor dem evtl.  zusätzlich  angegebenen
  1393.     Parameter '/R' ausgeführt.
  1394.  
  1395.     Hinweis:
  1396.  
  1397.     Der  Parameter  '&name' wird  nach den  anderen Parametern ausge-
  1398.     führt, so  daß er bei  der Erstinstallation die Angaben bzw. Vor-
  1399.     einstellungen  für die  Parameter  '/D',  '/L', '/F', '/A',  '/S'
  1400.     und '/Q' überschreibt.
  1401.  
  1402.  
  1403.     /Qn - Quiet-Modus ein/ausschalten
  1404.  
  1405.     Ein- (n=1) oder Ausschalten (n=0 Voreinstellung) des Quiet-Modus.
  1406.     Im Quiet-Modus werden alle akustischen Ausgaben des Disassemblers
  1407.     unterdrückt.
  1408.  
  1409.  
  1410.     # - Ausgabe der Codes der Funktionstasten
  1411.  
  1412.     Ausgabe  der internen  Tabelle  mit  den Codes für die Funktions-
  1413.     tasten zum Aufruf der einzelnen Funktionen des Disassemblers.
  1414.     (siehe die Beschreibung  des  Parameters '#' und die Beschreibung
  1415.     der Installation in der Dokumentation von MDEBUG)
  1416.  
  1417.  
  1418.  
  1419.  
  1420.  
  1421.  
  1422.  
  1423.  
  1424.  
  1425.  
  1426.  
  1427.  
  1428.  
  1429.  
  1430.  
  1431.  
  1432.  
  1433.  
  1434.  
  1435.  
  1436.  
  1437.  
  1438.  
  1439.     ────────────────────────────────────────────────────────────────────────────────
  1440.                                                                         Seite   19
  1441.  
  1442.  
  1443.  
  1444.     Aufruf des Disassemblers in MDEBUG
  1445.     ──────────────────────────────────
  1446.  
  1447.     Nachdem  der  Treiber MDDISDRV  installiert wurde  (vor oder nach
  1448.     MDEBUG), kann  der  Disassembler in  MDEBUG über  folgende Tasten
  1449.     bzw. Befehle aufgerufen werden:
  1450.  
  1451.  
  1452.     Aufruf des Disassemblers im Monitor von MDEBUG
  1453.     ──────────────────────────────────────────────
  1454.  
  1455.     <F5>       - Aufruf des  Disassemblers  mit den  aktuellen Werten
  1456.                  des Disassemblers
  1457.  
  1458.     <SHIFT-F5> - Aufruf des Disassemblers mit  dem Doppelwort auf dem
  1459.                  der Cursor steht
  1460.  
  1461.     <CTRL-F5>  - Aufruf des  Disassemblers  mit der Adresse des Bytes
  1462.                  auf dem der Cursor steht.
  1463.  
  1464.     <ALT-F5>   - Aufruf des Disassemblers mit dem Monitor-Segment als
  1465.                  Segment und dem  Wort auf  dem der  Cursor steht als
  1466.                  Offset für die Start-Adresse
  1467.  
  1468.  
  1469.     Aufruf des Disassemblers im Interpreter von MDEBUG
  1470.     ──────────────────────────────────────────────────
  1471.  
  1472.     <F5>       - Aufruf des  Disassemblers mit  den  aktuellen Werten
  1473.                  des Disassemblers
  1474.  
  1475.     <SHIFT-F5> - Aufruf  des  Disassemblers  mit  der  Return-Adresse
  1476.                  (RS:RO) als  Start-Adresse.  Zusätzlich  werden  die
  1477.                  Segment-Register DS, ES und SS des Disassemblers mit
  1478.                  den Werten der Segment-Register von MDEBUG geladen.
  1479.  
  1480.     <CTRL-F5>  - Aufruf  des  Disassemblers  mit  der  Monitor-Start-
  1481.                  Adresse als Start-Adresse
  1482.  
  1483.     Hinweis: Falls der Disassember  über  eine der o.a. Tasten (außer
  1484.              <F5>) aufgerufen wird, startet er immer im Disassembler-
  1485.              bzw. Assembler-Modus.
  1486.  
  1487.  
  1488.  
  1489.  
  1490.  
  1491.  
  1492.  
  1493.  
  1494.  
  1495.  
  1496.  
  1497.  
  1498.  
  1499.     ────────────────────────────────────────────────────────────────────────────────
  1500.                                                                         Seite   20
  1501.  
  1502.  
  1503.  
  1504.     Aufruf des Disassemblers durch Befehle in MDEBUG
  1505.     ────────────────────────────────────────────────
  1506.  
  1507.  
  1508.     DI {{ssss:}oooo}
  1509.  
  1510.     Aufruf des  Disassemblers  mit  'ssss' als Segment und 'oooo' als
  1511.     Offset für die Start-Adresse.  'ssss' und 'oooo' müssen hexadezi-
  1512.     male Werte zwischen 0h bis 0FFFFh sein.  Ausdrücke, Register oder
  1513.     Konstanten können nicht benutzt werden. Voreingestellt für 'ssss'
  1514.     und 'oooo' sind die aktuellen Werte des Disassemblers.
  1515.  
  1516.  
  1517.     DI In
  1518.  
  1519.     Aufruf des Disassemblers mit der Adresse  des Interrupts  'n' als
  1520.     Start-Adresse. 'n'  muß  ein hexadezimaler Wert  im Intervall von
  1521.     0 bis 0FFh sein.  Ausdrücke,  Register oder Konstanten sind nicht
  1522.     möglich.
  1523.  
  1524.  
  1525.  
  1526.     Weitere Befehle des Disassemblers für MDEBUG
  1527.     ────────────────────────────────────────────
  1528.  
  1529.     DC {text}
  1530.  
  1531.     Ausgabe des Textes 'text' auf den akt. Drucker des Disassemblers.
  1532.  
  1533.     Hinweis:
  1534.  
  1535.     Falls  hinter  dem  DC-Befehl kein weiterer Befehl  folgt, werden
  1536.     alle  folgenden  Leerzeichen  bis  zum  Ende der Eingabezeile von
  1537.     MDEBUG  mit ausgegeben.  Soll dies  unterbunden  werden,  muß das
  1538.     Ende der Parameter  des Befehls durch  das Verkettungszeichen von
  1539.     MDEBUG ('^') gekennzeichnet werden.
  1540.  
  1541.     Der  Befehl kann  nur genutzt werden,  falls DOS nicht aktiv ist.
  1542.  
  1543.     Hinweis: Hier  gelten die  gleichen  Einschränkungen  wie bei der
  1544.              Ausgabe von Speicherbereichen auf den Drucker.
  1545.              (siehe 'Allgemeines zum Sichern von Speicherbereichen')
  1546.  
  1547.  
  1548.     SM
  1549.  
  1550.     Übernahme der Start-Adresse des Disassemblers  in die Register SE
  1551.     und OF von MDEBUG.
  1552.  
  1553.  
  1554.  
  1555.  
  1556.  
  1557.  
  1558.  
  1559.     ────────────────────────────────────────────────────────────────────────────────
  1560.                                                                         Seite   21
  1561.  
  1562.  
  1563.  
  1564.     Bedienung des Disassemblers
  1565.     ───────────────────────────
  1566.  
  1567.  
  1568.  
  1569.     Aufbau der Windows
  1570.     ──────────────────
  1571.  
  1572.     ────────────────────────────────────────────────────────────────────────────────
  1573.  
  1574.     ╔══ MDDISDRV V2.05 ══════ Ziel-CPU:   V20/----- ══[inst. CPU:   V20/-----]═════╗
  1575.     ║ 2D69:423A  B8 FD FF             MOV AX,0FFFD  ;=65533               [ 8086]+ ║
  1576.     ║ 2D69:423D  E9 96 FE             JMP 040D6                           [ 8086]+ ║
  1577.     ║ 2D69:4240  3C 41                CMP AL,041 ; 'A' = 65 = 0100_0001xB [ 8086]+ ║
  1578.   ->║ 2D69:4242  72 0E                JB   04252                          [ 8086]+ ║
  1579.     ║ 2D69:4244  3C 5A                CMP AL,05A ; 'Z' = 90 = 0101_1010xB [ 8086]+ ║
  1580.     ║ 2D69:4246  77 0A                JA   04252                          [ 8086]+ ║
  1581.     ║ 2D69:4248  2C 41                SUB AL,041 ; 'A' = 65 = 0100_0001xB [ 8086]+ ║
  1582.     ║ 2D69:424A  53                   PUSH BX                             [ 8086]+ ║
  1583.     ║ 2D69:424B  BB 4F 12             MOV BX,0124F  ;= 4687               [ 8086]+ ║
  1584.     ║ 2D69:424E  D7                   XLAT                                [ 8086]+ ║
  1585.     ╟─ akt. Stack-Element:  5 ── Disp. Code: A Daten: A ─[BPuWRfapK]──[lpt1, 55]───╢
  1586.     ║  2D69:411F  2D69:410A  2D69:40DD  2D69:40CA  2D69:40AD                       ║
  1587.     ╟─ Register:  CS: 2D69 DS: 2D69 ES: 022C SS: 022C GS: 0000 FS: 0000 HB: 0000 ──╢
  1588.     ╠ 2D69:4252  F9                   STC                                 [ 8086]+ ╣
  1589.     ║ 2D69:4253  C3                   RET                                 [ 8086]+ ║
  1590.     ║                            < Tastenbelegung >                                ║
  1591.     ╚══════════════════════[ (c) 1991 - 1992 Bernd Schemmer ]══════════════════════╝
  1592.  
  1593.     ────────────────────────────────────────────────────────────────────────────────
  1594.     Abb. 1 - Aufbau des Windows im Disassembler-Modus
  1595.  
  1596.  
  1597.  
  1598.     Aufbau des Windows im Disassembler-Modus
  1599.     ────────────────────────────────────────
  1600.     [siehe Abb. 1]
  1601.  
  1602.     Im  Disassembler-Modus  zeigt  der  Disassembler  auf  dem oberen
  1603.     Rahmen des Windows die Ziel-CPUs und die installierten CPUs an.
  1604.  
  1605.     Die Ziel-CPUs sind  die Prozessoren  (Prozessor und  Coprozessor)
  1606.     für die disassembliert wird.  D.h. der Disassembler erkennt immer
  1607.     nur die Opcodes, die auch die aktuellen Ziel-CPUs  erkennen.  Die
  1608.     Ziel-CPUs werden mit den real installierten Prozessoren initiali-
  1609.     siert, können  aber jederzeit  geändert werden. Hierbei sind alle
  1610.     Variationen von Ziel-CPU und Ziel-CoCPU möglich.
  1611.  
  1612.  
  1613.  
  1614.  
  1615.  
  1616.  
  1617.  
  1618.  
  1619.     ────────────────────────────────────────────────────────────────────────────────
  1620.                                                                         Seite   22
  1621.  
  1622.  
  1623.  
  1624.     Die  Ziel-CPUs  sind  völlig  unahängig von  den real vorhandenen
  1625.     Prozessoren. Zwischen den CPU-Versionen mit 16-Bit-Bus und 8-Bit-
  1626.     Bus  (z.B.  8086 und 8088)  wird  nicht  unterschieden.  Gleiches
  1627.     gilt für die  CPU-Versionen mit 32-Bit- oder 16-Bit-Bus (z.B. der
  1628.     80386SX und der 80386)
  1629.  
  1630.     Die installierten CPUs sind die real vorhandenen Prozessoren. Sie
  1631.     werden nur einmal im Initialisierungsteil des Programms ermittelt
  1632.     und können nicht geändert werden.
  1633.     Die Angabe dient nur informatorischen Zwecken.
  1634.  
  1635.     Falls kein  Coprozessor  installiert ist  oder  keine  Ziel-CoCPU
  1636.     gewählt wurde, so wird als Name des  Coprozessors bzw.  der Ziel-
  1637.     CoCPU '-----' ausgegeben.
  1638.  
  1639.     In  den  folgenden  10 Zeilen  wird  jeweils ein disassemblierter
  1640.     Befehl angezeigt. [siehe Abb. 2]
  1641.  
  1642.  
  1643.     ────────────────────────────────────────────────────────────────────────────────
  1644.  
  1645.       ┌1. Feld┐  ┌───── 2. Feld ────┐ ┌───────── 3. Feld ───────────────┐ ┌4. Feld┐
  1646.       │       │  │                  │ │                                 │ │       │
  1647.     ║ 35B9:0216  BB 3A 03             MOV BX,033A  ;=  826                [ 8086]+ ║
  1648.       ┌──────── ┌──────────────────── ┌────────────────────────────────── ┌───────
  1649.       │         │                     │                                   │
  1650.       │         │                     │                                   └─ min.
  1651.       │         │                     └─ Prefixe, Mnemonic, Operanden     benötigte
  1652.       │         │                        und Kommentare                   CPU für
  1653.       │         │                                                         den Befehl
  1654.       │         └─ Byte(s) des Opcode in hexadezimaler Form
  1655.       │
  1656.       └─ Adresse des akt. Befehls (segment:offset, hexadezimal)
  1657.  
  1658.     ────────────────────────────────────────────────────────────────────────────────
  1659.     Abb. 2 - Aufbau einer Zeile im Disassembler-Modus
  1660.  
  1661.  
  1662.  
  1663.  
  1664.  
  1665.  
  1666.  
  1667.  
  1668.  
  1669.  
  1670.  
  1671.  
  1672.  
  1673.  
  1674.  
  1675.  
  1676.  
  1677.  
  1678.  
  1679.     ────────────────────────────────────────────────────────────────────────────────
  1680.                                                                         Seite   23
  1681.  
  1682.  
  1683.  
  1684.     Hinter dem Namen des mindestens für den Befehl nötigen Prozessors
  1685.     folgt noch ein bzw. zwei weitere Zeichen für die nähere  Spezifi-
  1686.     zierung des nötigen Prozessors. Hierbei gilt:
  1687.     Ein  '+' bedeutet,  daß  der Befehl ab dem angegebenen  Prozessor
  1688.     möglich ist,  das Zeichen '*'  wird  ausgegeben, falls der Befehl
  1689.     NUR auf  dem angegebenen  Prozessor möglich ist und ein 'P' zeigt
  1690.     an,  daß  der  Befehl  ab dem  angegebenen  Prozessor aber nur im
  1691.     Protected Mode möglich ist.
  1692.     Befehle,  die  auf  mehreren,  aber nicht  auf allen  Prozessoren
  1693.     möglich sind z.B. 'MOV AX,CS' (siehe 'OPCODES.PRT'), werden durch
  1694.     die  beiden  Zeichen  '+*'  gekennzeichnet.  Ebenfalls mit diesen
  1695.     beiden Zeichen markiert  werden die  Befehle, die von den Prozes-
  1696.     soren  unterschiedlich  ausgeführt  werden  (z.B.  'PUSH SP' oder
  1697.     'AAD' falls das zweite Byte des Opcode nicht 0Ah ist).
  1698.  
  1699.     Die  nächste  Zeile ist  die  Statuszeile des Disassemblers. Hier
  1700.     werden  die Anzahl der Elemente auf dem Adressen-Stack, die aktu-
  1701.     ellen  Modi für  die Ausgabe  von Offsets und Displacements (oder
  1702.     der aktuelle Modus für die Dumpzeile) und die aktuellen Werte der
  1703.     Schalter angezeigt. [siehe Abb. 3a und 3b]
  1704.  
  1705.  
  1706.     ────────────────────────────────────────────────────────────────────────────────
  1707.  
  1708.                                                       Anzahl Zeilen/Seite ──┐
  1709.                                                         akt. Drucker ─┐     │
  1710.                                                                       └──── └──
  1711.     ╟─ akt. Stack-Element:  1 ── Disp. Code: A Daten: A ───[BPuWRfapK]─[lpt1, 55]───╢
  1712.                             │                │        │     │││││││││
  1713.        Anzahl der Elemente  │                │        │     │││││││││
  1714.        auf dem Stack ───────┘                │        │     │││││││││
  1715.                                              │        │     │││││││││
  1716.     Anzeige-Modus für JMP/CALL-Displacements ┘        │     │││││││││
  1717.                                                       │     │││││││││
  1718.        Anzeige-Modus für Daten-Offsets ───────────────┘     │││││││││
  1719.                                                             │││││││││
  1720.                  Schalter B (mögliche Werte: 'B' und 'b') ──┘││││││││
  1721.                 Schalter P (mögliche Werte: 'P' und 'p') ────┘│││││││
  1722.                Schalter U (mögliche Werte: 'U' und 'u') ──────┘││││││
  1723.               Schalter W (mögliche Werte: 'W' und 'w') ────────┘│││││
  1724.              Schalter R (mögliche Werte: 'R' und 'r') ──────────┘││││
  1725.             Schalter F (mögliche Werte: 'F' und 'f') ────────────┘│││
  1726.            Schalter A (mögliche Werte: 'A' und 'a') ──────────────┘││
  1727.           Schalter L (mögliche Werte: 's', 'l', und 'p') ──────────┘│
  1728.          Schalter K (mögliche Werte: 'K' und 'k') ──────────────────┘
  1729.  
  1730.     ────────────────────────────────────────────────────────────────────────────────
  1731.     Abb. 3a - Aufbau der Statuszeile des Disassemblers im (Dis)Assembler-Modus
  1732.  
  1733.  
  1734.  
  1735.  
  1736.  
  1737.  
  1738.  
  1739.     ────────────────────────────────────────────────────────────────────────────────
  1740.                                                                         Seite   24
  1741.  
  1742.  
  1743.  
  1744.     ────────────────────────────────────────────────────────────────────────────────
  1745.  
  1746.                                                       Anzahl Zeilen/Seite ──┐
  1747.                                                         akt. Drucker ─┐     │
  1748.                                                                       └──── └──
  1749.  
  1750.     ╟─ akt. Stack-Element:  2 ── DumpLineModus: AW ──────[BPuWRfapk]──[lpt1, 55]───╢
  1751.                             │                   ┌─        │││││││││
  1752.        Anzahl der Elemente  │                   │         │││││││││
  1753.        auf dem Stack ───────┘                   │         │││││││││
  1754.                                                 │         │││││││││
  1755.        Anzeige-Modus für die Dump-Zeile ────────┘         │││││││││
  1756.        1. Zeichen: A - (Dis)Assembler-Modus               │││││││││
  1757.                    D - Dump-Modus                         │││││││││
  1758.        2. Zeichen: W - Segment = Register DS              │││││││││
  1759.                    D - Segment = 2. Wort aus der akt.     │││││││││
  1760.                                  Zeile                    │││││││││
  1761.       Der Offset wird in allen 4 Fällen aus dem 1. Wort   │││││││││
  1762.       der aktuellen Zeile ermittelt.                      │││││││││
  1763.                                                           │││││││││
  1764.                Schalter B (mögliche Werte: 'B' und 'b') ──┘││││││││
  1765.               Schalter P (mögliche Werte: 'P' und 'p') ────┘│││││││
  1766.              Schalter U (mögliche Werte: 'U' und 'u') ──────┘││││││
  1767.             Schalter W (mögliche Werte: 'W' und 'w') ────────┘│││││
  1768.            Schalter R (mögliche Werte: 'R' und 'r') ──────────┘││││
  1769.           Schalter F (mögliche Werte: 'F' und 'f') ────────────┘│││
  1770.          Schalter A (mögliche Werte: 'A' und 'a') ──────────────┘││
  1771.         Schalter L (mögliche Werte: 's', 'l', und 'p') ──────────┘│
  1772.        Schalter K (mögliche Werte: 'K' und 'k') ──────────────────┘
  1773.  
  1774.     ────────────────────────────────────────────────────────────────────────────────
  1775.     Abb. 3b - Aufbau der Statuszeile des Disassemblers im Dump-Modus
  1776.  
  1777.  
  1778.     Die folgende Zeile dient  zur Anzeige der obersten 7 Elemente auf
  1779.     dem Adressen-Stack. Das oberste Element des Adressen-Stacks (also
  1780.     die Adresse,  die beim  nächstem  pop vom Adressen-Stack entfernt
  1781.     wird, s.u.) wird in der Farbe 2 angezeigt.
  1782.     Adressen, die im Dump-Modus auf den Adressen-Stack gepusht worden
  1783.     sind,  werden  zusätzlich durch das  Zeichen '*' vor der  Adresse
  1784.     gekennzeichnet.
  1785.     Auf dem linken Rand, vor der ersten  Adresse, wird ein 'V' ausge-
  1786.     geben,  falls der  Adressen-Stack  voll ist.  Hinter  der letzten
  1787.     angezeigten  Adresse wird  das Zeichen '»' ausgegeben,  falls auf
  1788.     dem Adressen-Stack mehr als 7 Adressen sind.
  1789.  
  1790.  
  1791.  
  1792.  
  1793.  
  1794.  
  1795.  
  1796.  
  1797.  
  1798.  
  1799.     ────────────────────────────────────────────────────────────────────────────────
  1800.                                                                         Seite   25
  1801.  
  1802.  
  1803.  
  1804.     In  der  nächsten Zeile  werden die  Inhalte der Segment-Register
  1805.     CS, DS, ES, SS, FS und GS und  der  Inhalt des  Hilfsregisters HB
  1806.     des Disassemblers ausgegeben.  Die hier angezeigten  Werte werden
  1807.     vom  Disassembler  zur  Ermittlung  des  Segments (und das Hilfs-
  1808.     register HB für die Ermittlung des Offsets, s.u.) der Adresse aus
  1809.     einem Befehl benutzt.  Der Inhalt der der aktuellen CPU bekannten
  1810.     Segment-Register wird in der Farbe 2 ausgegeben.
  1811.  
  1812.     Der Inhalt der  nächsten beiden Zeilen ist abhängig vom Befehl in
  1813.     der aktuellen Zeile:
  1814.  
  1815.     Falls  der aktuelle  Befehl  einen  expliziten  Speicheroperanden
  1816.     enthält,  werden in der nächsten Zeile ein Ruler und in der über-
  1817.     nächsten Zeile die ersten 16 Byte des Speicheroperanden  in hexa-
  1818.     dezimaler Form und als ASCII-Codes angezeigt.
  1819.  
  1820.     Enthält der aktuelle Befehl eine implizite oder explizite Sprung-
  1821.     Adresse,  so  werden  in den  beiden folgenden  Zeilen die beiden
  1822.     ersten Befehle ab dieser Adresse angezeigt.
  1823.  
  1824.     In allen  anderen Fällen  wird nur  der Ruler  ausgegeben und die
  1825.     vorletzte ist Zeile leer.
  1826.  
  1827.     Das Segment der Adressen aus den Befehlen  wird vom  Disassembler
  1828.     analog zur Vorgehensweise des Prozessors ermittelt.  Ein Segment-
  1829.     Prefix in der aktuellen  Zeile wird nur  berücksichtigt, falls es
  1830.     auch vom Prozessor berücksichtigt würde.
  1831.  
  1832.     Falls  der Schalter  R auf 'R' steht,  wird der  Inhalt  der vor-
  1833.     letzten Zeile(n) in allen Modi kontinuierlich upgedatet.
  1834.  
  1835.     Die  letzte  Zeile des Windows  dient  zur Ausgabe  der aktuellen
  1836.     Tastenbelegung,  der Meldungen  und  der Eingabe-Aufforderung bei
  1837.     der Eingabe von Werten.
  1838.  
  1839.     Die  aktuelle  Zeile  des Disassemblers wird immer in der Farbe 3
  1840.     ausgegeben.
  1841.  
  1842.     Hinweis: In den Abbildungen ist die  aktuelle Zeile jeweils durch
  1843.              das Prefix '->' gekennzeichnet.
  1844.  
  1845.  
  1846.  
  1847.  
  1848.  
  1849.  
  1850.  
  1851.  
  1852.  
  1853.  
  1854.  
  1855.  
  1856.  
  1857.  
  1858.  
  1859.     ────────────────────────────────────────────────────────────────────────────────
  1860.                                                                         Seite   26
  1861.  
  1862.  
  1863.  
  1864.     ────────────────────────────────────────────────────────────────────────────────
  1865.  
  1866.     ╔══ MDDISDRV V2.05 ══════ Ziel-CPU:   V20/----- ══[inst. CPU:   V20/-----]═════╗
  1867.   ->║ MOV AX,0FFFD  ;=65533             ; 2D69:423A  B8 FD FF             [ 8086]+ ║
  1868.     ║ JMP 040D6                         ; 2D69:423D  E9 96 FE             [ 8086]+ ║
  1869.     ║ CMP AL,041 ; 'A' = 65             ; 2D69:4240  3C 41                [ 8086]+ ║
  1870.     ║ JB   04252                        ; 2D69:4242  72 0E                [ 8086]+ ║
  1871.     ║ CMP AL,05A ; 'Z' = 90             ; 2D69:4244  3C 5A                [ 8086]+ ║
  1872.     ║ JA   04252                        ; 2D69:4246  77 0A                [ 8086]+ ║
  1873.     ║ SUB AL,041 ; 'A' = 65             ; 2D69:4248  2C 41                [ 8086]+ ║
  1874.     ║ PUSH BX                           ; 2D69:424A  53                   [ 8086]+ ║
  1875.     ║ MOV BX,0124F  ;= 4687             ; 2D69:424B  BB 4F 12             [ 8086]+ ║
  1876.     ║ XLAT                              ; 2D69:424E  D7                   [ 8086]+ ║
  1877.     ╟─ akt. Stack-Element:  5 ── Disp. Code: A Daten: A ─[BPuWRfapK]──[lpt1, 55]───╢
  1878.     ║  2D69:411F  2D69:410A  2D69:40DD  2D69:40CA  2D69:40AD                       ║
  1879.     ╟─ Register:  CS: 2D69 DS: 0070 ES: 022C SS: 022C GS: 0000 FS: 0000 HB: 0000 ──╢
  1880.     ╠══seg:off══╤ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F ╤0123456789ABCDEF╣
  1881.     ║ 0070:FFFD │ 00 00 00 61 1B 2A 18 1B-1A C4 09 74 0A 71 06 80 │...a.*...─.t.q.Ç║
  1882.     ║                            < Tastenbelegung >                                ║
  1883.     ╚══════════════════════[ (c) 1991 - 1992 Bernd Schemmer ]══════════════════════╝
  1884.  
  1885.     ────────────────────────────────────────────────────────────────────────────────
  1886.     Abb. 4 - Aufbau des Windows im Assembler-Modus
  1887.  
  1888.  
  1889.     Aufbau des Windows im Assembler-Modus
  1890.     ─────────────────────────────────────
  1891.     [siehe Abb. 4]
  1892.  
  1893.     Der  Aufbau des  Windows  im  Assembler-Modus ist  äquivalent zum
  1894.     Aufbau des Windows im  Disassembler-Modus. Im Assembler-Modus ist
  1895.     nur die Reihenfolge der einzelnen Felder verändert.
  1896.     [siehe Abb. 4 und Abb. 5]
  1897.  
  1898.     Dieser Modus  ist vor allen  zur Sicherung  von  disassemblierten
  1899.     Code in eine Datei sinnvoll (s.u.).
  1900.  
  1901.  
  1902.  
  1903.  
  1904.  
  1905.  
  1906.  
  1907.  
  1908.  
  1909.  
  1910.  
  1911.  
  1912.  
  1913.  
  1914.  
  1915.  
  1916.  
  1917.  
  1918.  
  1919.     ────────────────────────────────────────────────────────────────────────────────
  1920.                                                                         Seite   27
  1921.  
  1922.  
  1923.  
  1924.     ────────────────────────────────────────────────────────────────────────────────
  1925.  
  1926.       ┌───── 1. Feld ───────────────┐  ┌ 2. Feld ┐  ┌──── 3. Feld ──────┐ ┌4. Feld┐
  1927.       │                             │  │         │  │                   │ │       │
  1928.     ║ MOV BX,013C  ;=  826               35B9:0218  BB 3C 01              [ 8086]+ ║
  1929.       ┌──────────────────────────────  ┌──────────  ┌──────────────────── ┌───────
  1930.       │                                │            │                     │
  1931.       │                                │            └─ Byte(s) des        └─ min.
  1932.       │                                │               Opcodes            benötigte
  1933.       │                                │                                  CPU für
  1934.       │                                │                                  den Befehl
  1935.       │                                └─ Adresse des Befehls (hex.)
  1936.       └─ Prefixe, Mnemonic, Operanden
  1937.          und Kommentare
  1938.  
  1939.     ────────────────────────────────────────────────────────────────────────────────
  1940.     Abb. 5 - Aufbau einer Zeile im Assembler-Modus
  1941.  
  1942.  
  1943.  
  1944.     Aufbau des Windows im Dump-Modus
  1945.     ────────────────────────────────
  1946.  
  1947.  
  1948.     ────────────────────────────────────────────────────────────────────────────────
  1949.  
  1950.     ╔══seg:off══╤ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F ╤0123456789ABCDEF╗
  1951.     ║ 022C:0E00 │ 98 63 79 22 82 22 3C 23-59 23 5F 23 C4 21 F0 21 │ÿcy"é"<Y_─ .    ║
  1952.   ->║ 022C:0E10 │ 55 1F BB 1F C7 1F 73 23-7D 23 50 1C 4C 1B 88 2A │U.╗.╟.s}P.L.ê*  ║
  1953.     ║ 022C:0E20 │ 25 24 87 2B 1B 2C C2 23-73 2B 78 2B 59 2B 97 24 │ $ç+.,┬s+x+Y+ù$ ║
  1954.     ║ 022C:0E30 │ 86 16 47 1B 3C 1B D9 1B-DB 1B 86 16 86 16 1F 1C │å.G.<.┘.█.å.å...║
  1955.     ║ 022C:0E40 │ 86 16 7D 2B 82 2B D6 23-AA 23 6E 1B 01 1D 6E 2B │å.}+é+╓¬n...n+  ║
  1956.     ║ 022C:0E50 │ 69 2B CE 1B 91 17 AE 17-CE 17 DF 17 8A 19 28 1B │i+╬.æ.«.╬.▀.è.(.║
  1957.     ║ 022C:0E60 │ 6C 19 3C 63 21 1C 12 14-07 1C 5E 1B FD 1A 86 1B │l.<c .....^.².å.║
  1958.     ║ 022C:0E70 │ 91 19 6D 2E B5 2D F1 2D-BE 6F FF 6E 99 6C AB 6D │æ.m.╡-±-╛o nÖl½m║
  1959.     ║ 022C:0E80 │ FF 6D 10 70 04 6E CB 6F-91 2E BB 6E DB 6E 4D 2D │ m.p.n╦oæ.╗n█nM-║
  1960.     ║ 022C:0E90 │ 1E 64 3B 65 17 65 FA 5E-74 63 F0 5E 8E 2C E6 2C │.d;e.e·^tc.^Ä,µ,║
  1961.     ╟─ akt. Stack-Element:  5 ── DumpLineModus: AW ──────[BPuWRfapK]──[lpt1, 55]───╢
  1962.     ║ *2D69:4000  2D69:410A  2D69:40DD  2D69:40CA  2D69:40AD                       ║
  1963.     ╟─ Register:  CS: 022C DS: 022C ES: 022C SS: 022C GS: 0000 FS: 0000 HB: 0000 ──╢
  1964.     ╠ 022C:1F55  1E                   PUSH DS                             [ 8086]+ ╣
  1965.     ║ 022C:1F56  56                   PUSH SI                             [ 8086]+ ║
  1966.     ║                            < Tastenbelegung >                                ║
  1967.     ╚══════════════════════[ (c) 1991 - 1992 Bernd Schemmer ]══════════════════════╝
  1968.  
  1969.     ────────────────────────────────────────────────────────────────────────────────
  1970.     Abb. 6 - Aufbau des Windows im Dump-Modus
  1971.  
  1972.  
  1973.  
  1974.  
  1975.  
  1976.  
  1977.  
  1978.  
  1979.     ────────────────────────────────────────────────────────────────────────────────
  1980.                                                                         Seite   28
  1981.  
  1982.  
  1983.  
  1984.     Im Dump-Modus werden auf dem oberen Rahmen  des Windows ein Ruler
  1985.     und  in  den  folgenden  10 Zeilen  jeweils 16 Byte des aktuellen
  1986.     Speicherbereichs  in hexadezimalen  Format  und  als  ASCII-Codes
  1987.     angezeigt. [siehe Abb. 6]
  1988.  
  1989.  
  1990.     ────────────────────────────────────────────────────────────────────────────────
  1991.  
  1992.       ┌1. Feld┐   ┌────────────── 2. Feld ──────────────────────┐  ┌── 3. Feld ───┐
  1993.       │       │   │                                             │  │              │
  1994.     ║ 35B9:023A │ FE FE EB 04 83 4E FE 01-B0 FF 89 46 FC 2E 8B 26 │■■δ.âN■.░ ëFⁿ.ï&║
  1995.       ┌────────   ┌──────────────────────────────────────────────  ┌───────────────
  1996.       │           │                                                │
  1997.       │           │                                                └─ 16. Bytes des
  1998.       │           │                                                Speicherbereichs
  1999.       │           └── 16 Bytes des Speicherbereichs in              als ASCII-Codes
  2000.       │               hexadezimaler Form                          ASCII-Codes kleiner
  2001.       │                                                           als 32 werden als
  2002.       │                                                           '.' dargestellt.
  2003.       │
  2004.       └─ Adresse des Speicherbereichs (segment:offset, hexadezimal)
  2005.  
  2006.     ────────────────────────────────────────────────────────────────────────────────
  2007.     Abb. 7 - Aufbau einer Zeile im Dump-Modus
  2008.  
  2009.  
  2010.     Der  Aufbau der  restlichen Zeilen ist,  bis auf  die beiden vor-
  2011.     letzten Zeilen,  mit dem Aufbau der  Zeilen im Disassembler-Modus
  2012.     identisch.
  2013.  
  2014.     Im  Dump-Modus kann  der Modus für die letzten beiden Zeilen frei
  2015.     gewählt werden. Zur Verfügung stehen hierbei folgende Modi:
  2016.  
  2017.     1. Anzeige der Daten ab der Adresse,  die im ersten Doppelwort in
  2018.        der aktuellen Zeile steht, im Dump-Modus. (DumpLineModus: DD)
  2019.  
  2020.     2. Anzeige der Daten ab der Adresse mit dem Offset aus dem ersten
  2021.        Wort in der aktuellen Zeile und dem Inhalt des Register DS als
  2022.        Segment-Register im Dump-Modus. (DumpLineModus: DW)
  2023.  
  2024.     3. Anzeige  des  dissassemblieren Codes  ab der  Adresse,  die im
  2025.        ersten Doppelwort in der aktuellen Zeile steht.
  2026.        (DumpLineModus: AD)
  2027.  
  2028.     4. Anzeige  des  disassemblieren  Codes  ab der  Adresse  mit dem
  2029.        Offset  aus dem  ersten Wort  in der  aktuellen Zeile und  dem
  2030.        Inhalt des Registers DS als Segment. (DumpLineModus: AW)
  2031.  
  2032.  
  2033.  
  2034.  
  2035.  
  2036.  
  2037.  
  2038.  
  2039.     ────────────────────────────────────────────────────────────────────────────────
  2040.                                                                         Seite   29
  2041.  
  2042.  
  2043.  
  2044.     Tastenbelegung des Disassemblers
  2045.     ────────────────────────────────
  2046.  
  2047.     Der Disassembler  kann über verschiedene Tasten  und Tastenkombi-
  2048.     nation gesteuert werden. Diese werden im folgenden erläutert.
  2049.  
  2050.     Bei den Beschreibungen werden folgende Vereinbarungen benutzt:
  2051.  
  2052.     o 'Start-Adresse'  bezeichnet  immer  die  Adresse aus der ersten
  2053.       Zeile des Windows des Disassemblers.
  2054.  
  2055.     o Die aktuelle Zeile ist immer die Zeile, die in der  Farbe 2 an-
  2056.       gezeigt wird.  In  den Abbildungen  ist  diese Zeile  durch das
  2057.       Prefix '->' gekennzeichnet.
  2058.  
  2059.     Die Tasten können, falls  nichts anderes  angegeben ist, in allen
  2060.     Anzeige-Modi benutzt werden.
  2061.  
  2062.  
  2063.     <F2>       - Ändern der Ziel-CPU.
  2064.  
  2065.  
  2066.     <SHIFT-F2> - Ändern der Ziel-CoCPU
  2067.  
  2068.  
  2069.     <F3>       - Wechseln zwischen dem Dump- und Disassembler-Modus
  2070.  
  2071.  
  2072.     <CTRL-F3>  - Ändern des Modus für die Dump-Zeile im Dump-Modus
  2073.                  (= DumpLineModus)
  2074.  
  2075.  
  2076.     <CursorUp>, <CursorDown>
  2077.     <Blank>    - zeilenweises Scrollen des Speicherbereichs
  2078.  
  2079.  
  2080.     <PgUp>, <PgDn>
  2081.     <RETURN>   - seitenweises Scrollen des Speicherbereichs
  2082.  
  2083.  
  2084.  
  2085.  
  2086.  
  2087.  
  2088.  
  2089.  
  2090.  
  2091.  
  2092.  
  2093.  
  2094.  
  2095.  
  2096.  
  2097.  
  2098.  
  2099.     ────────────────────────────────────────────────────────────────────────────────
  2100.                                                                         Seite   30
  2101.  
  2102.  
  2103.  
  2104.     <CTRL-CursorUp>, <+>
  2105.                - Erhöhen des Offsets der Start-Adresse um 1
  2106.  
  2107.  
  2108.     <CTRL-CursorDown>, <->
  2109.                - Vermindern des Offsets der Start-Adresse um 1
  2110.  
  2111.  
  2112.     <W>        - Erhöhen des Offsets der Start-Adresse um 2
  2113.  
  2114.  
  2115.     <A>        - Vermindern des Offsets der Start-Adresse um 2
  2116.  
  2117.  
  2118.     <0>        - Nochmalige Anzeige des letzten Speicherbereichs
  2119.  
  2120.  
  2121.     <CTRL-T>   - Aktuelle Zeile zur ersten Zeile im Window machen
  2122.  
  2123.  
  2124.     <Home>     - Erste Zeile des Windows zur aktuellen Zeile machen
  2125.  
  2126.  
  2127.     <End>      - Letzte Zeile des Windows zur aktuellen Zeile machen
  2128.  
  2129.  
  2130.     <F4>, <J>  - Eingabe einer neuen Start-Adresse
  2131.  
  2132.     Die Eingabe einer neuen Start-Adresse muß im hexadezimalen Format
  2133.     erfolgen.  Der Cursor  wird bei  der Eingabe durch ein blinkendes
  2134.     Zeichen und/oder durch eine andere Farbe für das aktuelle Zeichen
  2135.     dargestellt  -  dies ist  abhängig  vom Modus  der  installierten
  2136.     Graphik-Karte und vom Farbattribut  für die Farbe 2.  Während der
  2137.     Eingabe gilt immer der Overwrite-Modus.
  2138.  
  2139.     Hinweis: Falls der Cursor nicht sichtbar ist, muß die Farbe 1 und
  2140.              /oder die Farbe 2 geändert werden.
  2141.  
  2142.     Zur Positionierung des Cursors bei der Eingabe können die  Tasten
  2143.     <CursorRight>, <CursorLeft>,  <Home> und <End> verwendet  werden.
  2144.     Die Taste <Tab> positioniert den Cursor auf den Anfang des Feldes
  2145.     für den Offset und die  Taste <SHIFT-Tab> positioniert den Cursor
  2146.     auf den Anfang des Feldes für das Segment.
  2147.     Beendet wird die Eingabe  mit <RETURN>. <ESC> bricht die Änderung
  2148.     ab, d.h. die Start-Adresse wird nicht verändert.  Beachtet werden
  2149.     muß,  daß,  falls  das Segment der Start-Adresse  geändert  wird,
  2150.     auch implizit  das Segment-Register CS  neu besetzt wird (auch im
  2151.     Dump-Modus).
  2152.  
  2153.  
  2154.  
  2155.  
  2156.  
  2157.  
  2158.  
  2159.     ────────────────────────────────────────────────────────────────────────────────
  2160.                                                                         Seite   31
  2161.  
  2162.  
  2163.  
  2164.     <I>        - Anzeige des Codes für einen Interrupt
  2165.  
  2166.     Nach  der Eingabe  von I  kann die  Nummer des Interrupts, dessen
  2167.     Code  disassembliert werden  soll,  im hexadezimalem Format ange-
  2168.     geben werden (Intervall: 0..0FFh).
  2169.     Bei  der Eingabe  gelten die  gleichen Tasten wie bei der Eingabe
  2170.     einer  neuen  Start-Adresse (mit Ausnahme der Tasten  <SHIFT-Tab>
  2171.     und <Tab>, die hier analog der Taste <Home> belegt sind.).
  2172.  
  2173.  
  2174.     <F5>       - Ändern der Inhalte der Register
  2175.  
  2176.     Beim  Editieren  der Inhalte  der Register  gelten  ebenfalls die
  2177.     gleichen Tasten  wie bei  der Eingabe einer neuen  Start-Adresse.
  2178.     Ausgenommen hiervon  sind nur  die  Tasten <Tab>  und <SHIFT-Tab>
  2179.     die hier zum Wechseln des Registers dienen.
  2180.     Durch die  Änderung des  Registers CS wird auch  das Segment  der
  2181.     Start-Adresse geändert!
  2182.     Der Inhalt des Register CS  wird zudem  immer implizit  geändert,
  2183.     falls die Start-Adresse verändert wird.
  2184.  
  2185.  
  2186.     <SHIFT-F5>
  2187.  
  2188.     Lädt die Register DS,  ES, SS und,  falls als Ziel-CPU  der 80386
  2189.     gewählt wurde, FS und GS mit dem Wert aus dem Register CS.
  2190.  
  2191.  
  2192.     <C>, <D>, <E>, <S>,  <F>, <G>
  2193.  
  2194.     Editieren des Inhaltes des Segment-Registers mit dem eingegebenen
  2195.     Buchstaben als Anfangsbuchstaben. (z.B. <E> ->> Register ES)
  2196.  
  2197.  
  2198.     <H>        - Editieren des Inhaltes des Hilfsregisters
  2199.  
  2200.  
  2201.     <CTRL-N>   - Normalisieren der Start-Adresse so das gilt
  2202.                  0 <= Offset <= 0Fh
  2203.                  (ohne Berücksichtigung eines evtl. Überlaufs)
  2204.  
  2205.  
  2206.     <ESC>, <Q>
  2207.                - Disassembler verlassen, Rückkehr nach MDEBUG
  2208.  
  2209.  
  2210.     <F10>, <X>
  2211.                - Disassembler und MDEBUG verlassen
  2212.  
  2213.  
  2214.  
  2215.  
  2216.  
  2217.  
  2218.  
  2219.     ────────────────────────────────────────────────────────────────────────────────
  2220.                                                                         Seite   32
  2221.  
  2222.  
  2223.  
  2224.     <CTRL-F10>
  2225.  
  2226.     Übernahme der Start-Adresse des Disassemblers  in die Register SE
  2227.     und OF des Monitors von MDEBUG und Verlassen des Disassemblers.
  2228.  
  2229.  
  2230.     <ALT-F10>
  2231.  
  2232.     Falls  auf  die aktuelle  Zeile die  Funktion  'Folge dem Befehl'
  2233.     möglich ist  (s.u.),  wird die Adresse aus der aktuellen Zeile in
  2234.     die Register SE und OF des Monitors von MDEBUG übernommen und der
  2235.     Disassembler verlassen.
  2236.  
  2237.  
  2238.     <ALT-F5>
  2239.  
  2240.     Disassembler  und MDEBUG verlassen mit automatischem Neuaufaufruf
  2241.     von MDEBUG falls DOS nicht aktiv ist.
  2242.  
  2243.  
  2244.     <F1>       - Aufruf der Online-Hilfe
  2245.  
  2246.     Die Online-Hilfe besteht aus zwei Seiten, wobei die Seite mit der
  2247.     Beschreibung  der Statuszeilen  teilweise  kontext-sensitiv  ist.
  2248.     (will sagen:  Die in der Online-Hilfe angezeigte Statuszeile ent-
  2249.     spricht der normalen Statuszeile). Die aktuelle Seite der Online-
  2250.     Hilfe kann  über die Taste <RETURN>  gewechselt werden, die Taste
  2251.     <ESC> beendet die  Online-Hilfe.  Die Schalter und  Variablen des
  2252.     Disassemblers können auch direkt  während der Anzeige der zweiten
  2253.     Seite der Online-Hilfe geändert werden.
  2254.     Die zweite Seite der Online-Hilfe kann auch direkt über die Taste
  2255.     <O> aufgerufen werden.
  2256.     Falls die Online-Hilfe über die Taste <F10> verlassen wird,  wird
  2257.     der Aufruf des Disassemblers und MDEBUGs sofort beendet.
  2258.  
  2259.     <ALT-L>    - nochmalige Anzeige der letzten Meldung
  2260.  
  2261.  
  2262.     <CTRL-PgUp>, <CTRL-PgDn>
  2263.                - verschieben des Windows des Disassemblers um eine
  2264.                  Zeile nach oben bzw. unten
  2265.  
  2266.  
  2267.     <CTRL-End>,  <CTRL-Home>
  2268.                - verschieben des Windows in den unteren bzw. oberen
  2269.                  Bildschirmbereich.
  2270.  
  2271.  
  2272.     <ALT-F9>   - Neuaufbau des Windows
  2273.  
  2274.  
  2275.  
  2276.  
  2277.  
  2278.  
  2279.     ────────────────────────────────────────────────────────────────────────────────
  2280.                                                                         Seite   33
  2281.  
  2282.  
  2283.  
  2284.     <CTRL-F1>
  2285.  
  2286.     Die Taste <CTRL-F1> schließt  das Window  des  Disassemblers  und
  2287.     restauriert  den Bildschirm unter dem Window.  Nach dem Betätigen
  2288.     einer Taste wird das Window des Disassemblers wieder geöffnet.
  2289.  
  2290.  
  2291.     <ALT-1> .. <ALT-9>
  2292.  
  2293.     Setze Marker # auf die Adresse in der aktuellen Zeile
  2294.     Falls  auf einer Adresse ein Marker steht, wird vor der Zeile auf
  2295.     dem Rahmen die Nummer des Markers in der Farbe 2 angezeigt.
  2296.     Sind auf einer Adresse mehrere Marker gesetzt,  so wird immer nur
  2297.     der Marker mit der kleinsten Nummer angezeigt.
  2298.     Da  zur Überprüfung,  ob auf einer Adresse ein  Marker steht, die
  2299.     Adressen  normalisiert werden,  sind die einzelnen Werte des Seg-
  2300.     ments  und Offsets  unerheblich - wesentlich  ist nur die Adresse
  2301.     die sich aus diesen beiden Werten ergibt.
  2302.  
  2303.     Da die Marker 1 und 2 für die Sicherung  von Speicherbereichen in
  2304.     eine Datei  bzw. für den  Ausdruck von  Speicherbereichen benutzt
  2305.     werden (s.u.),  sollten soweit  möglich nur die Marker  von 3 bis
  2306.     9 zur Markierung von Adressen benutzt werden.
  2307.  
  2308.     Nach dem Programmstart sind alle Marker gelöscht.
  2309.  
  2310.  
  2311.     <1> .. <9>
  2312.  
  2313.     Springe zum Marker #. Es können nur schon  gesetzte  Marker ange-
  2314.     sprungen werden.
  2315.  
  2316.  
  2317.     <ALT-0>    - Lösche alle Marker
  2318.  
  2319.  
  2320.  
  2321.  
  2322.  
  2323.  
  2324.  
  2325.  
  2326.  
  2327.  
  2328.  
  2329.  
  2330.  
  2331.  
  2332.  
  2333.  
  2334.  
  2335.  
  2336.  
  2337.  
  2338.  
  2339.     ────────────────────────────────────────────────────────────────────────────────
  2340.                                                                         Seite   34
  2341.  
  2342.  
  2343.  
  2344.     Suchen von Referenzen
  2345.     ─────────────────────
  2346.  
  2347.     Bei der Disassemblierung von unbekannten Code ist es häufig nötig
  2348.     zu wissen,  wann auf  eine Speicherstelle  zugegriffen  wird bzw.
  2349.     wann eine Routine aufgerufen wird.
  2350.  
  2351.     Für diese Aufgaben besitzt der Disassembler folgende Funktionen:
  2352.  
  2353.  
  2354.     <F8>
  2355.  
  2356.     Suche eine Code-Referenz  (z.B.  'jmp n', 'int n', 'jc nn', etc.)
  2357.     auf eine beliebige Adresse ab der Adresse in der aktuellen Zeile.
  2358.  
  2359.  
  2360.     <SHIFT-F8>
  2361.  
  2362.     Suche eine Daten-Referenz  (z.B. 'mov ax,[nn]', 'inc [nn]', etc.)
  2363.     auf eine beliebige Adresse ab der Adresse in der aktuellen Zeile.
  2364.  
  2365.  
  2366.     In beiden  Fällen kann als Adresse, auf die eine Referenz gesucht
  2367.     werden  soll, eine  beliebige Kombination  aus Segment und Offset
  2368.     eingegeben werden. Beachtet werden  muß, daß bei der  Suche  nach
  2369.     einer Daten-Referenz der eingegebene  Wert  für das Segment igno-
  2370.     riert wird.
  2371.  
  2372.     Gesucht  wird immer  nur bis  zum Ende eines Segments.  Die Suche
  2373.     kann  jederzeit  über die Taste <ESC>  abgebrochen werden.  Falls
  2374.     die Suche  abgebrochen oder  keine Referenz  gefunden wurde, kann
  2375.     direkt nach der Suche über die Taste  <0> die  letzte  überprüfte
  2376.     Adresse ermittelt werden.  Wird  eine Referenz gefunden, wird der
  2377.     Code ab dem gefundenen Befehl im Disassembler  angezeigt (und die
  2378.     Taste <0> behält ihre ursprüngliche Funktion).
  2379.  
  2380.     Während der Suche zeigt  der Disassembler zur optischen Kontrolle
  2381.     jeweils den Code, den er gerade überprüft, an.
  2382.  
  2383.  
  2384.     <CTRL-F8>
  2385.  
  2386.     Letzte Suche fortsetzen.
  2387.     Gesucht wird die zuletzt gesuchte Adresse mit dem zuletzt angege-
  2388.     benen Referenz-Art (Code/Data) ab dem auf  den zuletzt gefundenen
  2389.     Befehl folgenden Befehl (d.h. nicht ab dem aktuellen Befehl!).
  2390.     Diese  Funktion  ist nur möglich, falls vorher  mindestens einmal
  2391.     eine Daten- oder Code-Referenz gesucht wurde.
  2392.  
  2393.  
  2394.  
  2395.  
  2396.  
  2397.  
  2398.  
  2399.     ────────────────────────────────────────────────────────────────────────────────
  2400.                                                                         Seite   35
  2401.  
  2402.  
  2403.  
  2404.     Benutzung des Adressen-Stacks
  2405.     ─────────────────────────────
  2406.  
  2407.     Zum  bequemen  Verfolgen  des  Programmflußes,  besitzt  der Dis-
  2408.     assembler einen Adressen-Stack.
  2409.  
  2410.     Der  Adressen-Stack ist  als Ring-Puffer organisiert und kann bis
  2411.     zu 25 Einträge aufnehmen.  Die  aktuelle Anzahl  der Adressen auf
  2412.     dem Adressen-Stack wird immer in der Statuszeile angezeigt.
  2413.     [siehe Abb. 3a und 3b]
  2414.  
  2415.     In der  auf die  Statuszeile  folgenden  Zeile  werden  immer die
  2416.     obersten 7 Elemente des Adressen-Stacks angezeigt.
  2417.  
  2418.     Zur  Manipulation des  Adressen-Stacks stehen folgende Tasten zur
  2419.     Verfügung:
  2420.  
  2421.     <Insert> pusht die Adresse des Speicherbereichs aus der aktuellen
  2422.     Zeile auf den Adressen-Stack. <Delete> löscht die oberste Adresse
  2423.     vom  Adressen-Stack  und  <CTRL-D> löscht  den gesamten Adressen-
  2424.     Stack.
  2425.     <CursorRight>  popt die  oberste Adresse  vom Adressen-Stack  und
  2426.     übernimmt diese als neue Start-Adresse für den  Disassembler. Der
  2427.     aktuelle Anzeige-Modus des Disassemblers und die  aktuelle  Zeile
  2428.     werden  entsprechend  den  für  die Adresse  gespeicherten  Daten
  2429.     korrigiert.
  2430.  
  2431.     Es ist  ebenfalls möglich,  jede Adresse  vom  Adressen-Stack als
  2432.     neue  Start-Adresse zu  nehmen, ohne diese vom  Adressen-Stack zu
  2433.     entfernen.
  2434.  
  2435.     Dazu dienen die Tasten  <Tab> und <SHIFT-Tab>. Nach dem Betätigen
  2436.     einer  dieser beiden  Tasten  befindet sich  der Disassembler  im
  2437.     Scrollstackmodus, in welchem über die Tasten  <Tab>, <SHIFT-Tab>,
  2438.     <CursorLeft>,  <CursorRight>,  <Home>  und <End> eine Adresse vom
  2439.     Adressen-Stack gewählt werden kann.
  2440.     In  diesem Modus  wird die  Anzahl der Elemente auf dem Adressen-
  2441.     Stack  in der  letzten Zeile  des  Windows  angezeigt und in  der
  2442.     Statuszeile wird immer  die Nummer  des aktuellen  Stack-Elements
  2443.     angezeigt.  Im  Scrollstackmodus  werden  in den oberen 10 Zeilen
  2444.     immer der Code bzw. die Daten  der aktuellen  Stack-Adresse ange-
  2445.     zeigt. (Falls dies nicht  erwünscht ist, muß der Modus  über  die
  2446.     Taste <SHIFT-Tab> aufgerufen werden.)
  2447.  
  2448.  
  2449.  
  2450.  
  2451.  
  2452.  
  2453.  
  2454.  
  2455.  
  2456.  
  2457.  
  2458.  
  2459.     ────────────────────────────────────────────────────────────────────────────────
  2460.                                                                         Seite   36
  2461.  
  2462.  
  2463.  
  2464.     Verlassen  werden  kann  der Modus über die  Tasten <RETURN> oder
  2465.     <ESC>.  Wird der  Modus über <RETURN> verlassen, so übernimmt der
  2466.     Disassembler die  aktuelle Adresse vom  Adressen-Stack (also die,
  2467.     die ganz links  in der  Farbe 2  angezeigt wird) als  neue Start-
  2468.     Adresse und ändert den aktuellen  Anzeige-Modus und die  aktuelle
  2469.     Zeile entsprechend der neuen Adresse. Abgebrochen werden kann der
  2470.     Scrollstackmodus über die Taste <ESC>.
  2471.  
  2472.  
  2473.  
  2474.     Die Funktion 'Folge dem Befehl'
  2475.     ───────────────────────────────
  2476.  
  2477.     Zusätzlich besitzt der Disassembler die Möglichkeit mit der Taste
  2478.     <CursorLeft> dem aktuellen Befehl zu 'folgen'.
  2479.  
  2480.     Dies bedeutet im Disassembler- und im Assembler-Modus:
  2481.  
  2482.     Falls  der Befehl  in der aktuellen  Zeile einen explizit angege-
  2483.     benen Speicheroperanden enthält, wird die Adresse des Befehls aus
  2484.     der Zeile auf  den  Adressen-Stack gepusht und  die  Adresse  des
  2485.     Operanden aus dem Befehl als neue Start-Adresse genommen.
  2486.  
  2487.     Falls  der Speicheroperand in der aktuellen Zeile zusätzlich über
  2488.     ein  Index-  oder ein Basisregister adressiert wird, wird auf den
  2489.     Offset der neuen Start-Adresse noch der Inhalt des Registers 'HB'
  2490.     aufaddiert  (ohne  Berücksichtigung  eines  Überlaufs).  D.h. das
  2491.     Register 'HB' repräsentiert, je nach  Adressierung des Operanden,
  2492.     eines oder mehrere der Registers SI, DI, BP oder BX.
  2493.  
  2494.     Beispiele:
  2495.  
  2496.     ┌───────────────────┬─────────────────────────────────────────────┐
  2497.     │                   │ Adresse für die Funktion 'Folge dem Befehl' │
  2498.     │ Befehl            │ (Register 'HB' enthalte den Wert 1000h)     │
  2499.     ╞═══════════════════╪═════════════════════════════════════════════╡
  2500.     │ ES: MOV AX,[0400] │ ES:0400                                     │
  2501.     │ SS: INC W[0100]   │ SS:0100                                     │
  2502.     │ MOV AX,[BX+0500]  │ DS:1500                                     │
  2503.     │ INC [BP]          │ SS:1000                                     │
  2504.     │ MOV [BP+SI],0100  │ SS:1000                                     │
  2505.     └───────────────────┴─────────────────────────────────────────────┘
  2506.  
  2507.  
  2508.     Die  Funktion 'Folge dem Befehl'  kann auch  auf alle Befehle mit
  2509.     einem expliziten oder impliziten Sprungziel angewendet werden. In
  2510.     diesem  Fall ermittelt  der Disassembler  die neue  Start-Adresse
  2511.     analog der Vorgehensweise des Prozessors. Außerdem wird in diesem
  2512.     Fall  nicht  die  Adresse  des  Befehls in  der aktuellen  Zeile,
  2513.     sondern die   Adresse des  Befehls in der folgenden Zeile auf den
  2514.     Adressen-Stack  gesichert.  Der  Inhalt  des  Hilfsregisters 'HB'
  2515.     wird hierbei auf keinem Fall berücksichtigt.
  2516.  
  2517.  
  2518.  
  2519.     ────────────────────────────────────────────────────────────────────────────────
  2520.                                                                         Seite   37
  2521.  
  2522.  
  2523.  
  2524.     Das Segment der neuen Start-Adresse  wird in allen  Fällen analog
  2525.     zur Vorgehensweise des Prozessors ermittelt.
  2526.  
  2527.     Das Segment für die neue Start-Adresse ist entweder
  2528.  
  2529.     ■ der Inhalt des Segment-Registers DS
  2530.       - bei Befehlen mit Speicheroperanden für deren Adressierung
  2531.         NICHT das Register BP verwendet wird
  2532.         Beispiel: 'MOV BX,W[0012]' oder 'INC B[DI+04]'
  2533.  
  2534.     ■ der Inhalt des Segment-Registers SS
  2535.       - bei Befehlen mit Speicheroperanden, die u.a. durch das
  2536.         Register BP addressiert werden
  2537.         Beispiel: 'MOV BX,W[BP+0012]'
  2538.  
  2539.     ■ der Inhalt des Segment-Registers CS
  2540.       - bei direkten intrasegment JMP- und CALL-Befehlen
  2541.         Beispiel: 'JMP 04566'
  2542.  
  2543.     ■ direkt im Befehl enthalten
  2544.       - bei direkten intersegment JMP- und CALL-Befehlen
  2545.         Beispiel: 'CALL 04455:0044'
  2546.  
  2547.     oder
  2548.  
  2549.     ■ implizit im Befehl enthalten
  2550.       - bei Befehlen zum Aufruf eines Interrupts
  2551.         Beispiel: 'INT 021', aber auch bei den Befehl
  2552.                   'INTO' (Interrupt 4)
  2553.  
  2554.     Segment-Prefixe  in der  aktuellen Zeile werden  vom Disassembler
  2555.     bei der Ermittlung des Segments der neuen Start-Adresse ebenfalls
  2556.     berücksichtigt  -  falls sie auch vom aktuellen Prozessor berück-
  2557.     sichtigt würden.
  2558.     Der  Anzeige-Modus des Disassemblers wird automatisch der Art des
  2559.     Speicherzugriffs des Befehls aus der aktuellen Zeile angepasst.
  2560.  
  2561.  
  2562.     Die  Funktion  'Folge dem Befehl'  kann im Disassembler-Modus auf
  2563.     folgende Anweisungen angewendet werden:
  2564.  
  2565.     ■ direkte JMP- und CALL-Befehle
  2566.  
  2567.     ■ Befehle mit impliziten Sprungziel
  2568.  
  2569.     ■ Befehle mit expliziten Speicheroperanden
  2570.  
  2571.     ■ ESC-Befehle,  bei  denen  im 'mod r/m'-Byte  die  Adresse eines
  2572.       Speicheroperanden  codiert ist -  d.h.  Coprozessor-Befehle mit
  2573.       einem  Speicheroperanden  die  von  der  aktuellen   Ziel-CoCPU
  2574.       nicht erkannt werden.
  2575.  
  2576.  
  2577.  
  2578.  
  2579.     ────────────────────────────────────────────────────────────────────────────────
  2580.                                                                         Seite   38
  2581.  
  2582.  
  2583.  
  2584.     ■ Da der Disassembler bei Befehlen, mit denen ein expliziter Wert
  2585.       in ein  Wort-Register geladen wird, nicht entscheiden kann,  ob
  2586.       es  sich hierbei  um eine  Konstante oder einen Offset handelt,
  2587.       kann  die Funktion  'Folge dem Befehl' auch  auf  diese Befehle
  2588.       angewendet werden.
  2589.  
  2590.     Ob  die  Funktion 'Folge  dem Befehl'  auf  den aktuellen  Befehl
  2591.     anwendbar ist, ist auch an der vorletzten Zeile  erkennbar. Falls
  2592.     diese leer ist, ist die Funktion nicht anwendbar.
  2593.  
  2594.     Der aktuelle Modus zur Anzeige von  Displacements und Offsets ist
  2595.     für die Funktion 'Folge dem Befehl' bedeutungslos.
  2596.  
  2597.  
  2598.     Im Dump-Modus ist die Funktion 'Folge dem Befehl' in  jeder Zeile
  2599.     möglich.  Hier richtet sich die neue Start-Adresse des Disassemb-
  2600.     lers nach der Anwendung dieser Funktion nach  den  aktuellen Wert
  2601.     des Schalters 'DumpLineMode':
  2602.  
  2603.     ┌───────────┬─────────────┬──────────────────────────────────────┐
  2604.     │ Wert des  │ neuer       │          Neue Start-Adresse          │
  2605.     │ Schalters │ Modus       │     Segment        │   Offset        │
  2606.     ╞═══════════╪═════════════╪════════════════════╪═════════════════╡
  2607.     │   DD      │ Dump        │    2. Wort in der  │ 1. Wort in der  │
  2608.     │           │             │    aktuellen Zeile │ aktuellen Zeile │
  2609.     ├───────────┼─────────────┼────────────────────┼─────────────────┤
  2610.     │   DW      │ Dump        │    Register DS     │ 1. Wort in der  │
  2611.     │           │             │                    │ aktuellen Zeile │
  2612.     ├───────────┼─────────────┼────────────────────┼─────────────────┤
  2613.     │   AD      │ Disassemble │    2 Wort in der   │ 1. Wort in der  │
  2614.     │           │ /Assemble   │    aktuellen Zeile │ aktuellen Zeile │
  2615.     ├───────────┼─────────────┼────────────────────┼─────────────────┤
  2616.     │   AW      │ Disassemble │    Register DS     │ 1. Wort in der  │
  2617.     │           │ /Assemble   │                    │ aktuellen Zeile │
  2618.     └───────────┴─────────────┴────────────────────┴─────────────────┘
  2619.  
  2620.     Der Wert des Schalters 'DumpLineMode' wird (nur) im Dump-Modus in
  2621.     der Statuszeile angezeigt. [siehe Abb. 3b]
  2622.     Er kann über die Taste <CTRL-F3> umgeschaltet werden.
  2623.     Die  Funktion 'Folge dem Befehl'  kann in allen Anzeige-Modi auch
  2624.     über  die  Tasten <ALT-CursorLeft>  oder  <Backspace>  aufgerufen
  2625.     werden. In diesem Fall wird die aktuelle Adresse  vor der Anzeige
  2626.     des  neuen  Speicherbereichs aber  NICHT  auf dem  Adressen-Stack
  2627.     gespeichert.
  2628.  
  2629.  
  2630.  
  2631.  
  2632.  
  2633.  
  2634.  
  2635.  
  2636.  
  2637.  
  2638.  
  2639.     ────────────────────────────────────────────────────────────────────────────────
  2640.                                                                         Seite   39
  2641.  
  2642.  
  2643.  
  2644.     Die Schalter des Disassemblers
  2645.     ──────────────────────────────
  2646.  
  2647.     Die Ausgabe und das Verhalten des  Disassemblers können auch über
  2648.     mehrere Schalter verändert werden.
  2649.  
  2650.     Die aktuellen Werte der wichtigsten  Schalter werden immer in der
  2651.     Statuszeile angezeigt. [siehe Abb. 3a und 3b]
  2652.  
  2653.  
  2654.  
  2655.     Anzeige-Modi für Offsets und Displacements
  2656.     ──────────────────────────────────────────
  2657.  
  2658.  
  2659.     Normalerweise  konvertiert  der  Disassembler alle relativen Dis-
  2660.     placements in JMP- und CALL-Befehlen zu absoluten Werten. Da dies
  2661.     nicht  immer erwünscht  ist, kann er diese auch als zum aktuellen
  2662.     Instruktion-Pointer relative Offsets ausgeben. [siehe Abb. 8]
  2663.  
  2664.     ────────────────────────────────────────────────────────────────────────────────
  2665.  
  2666.     ╔══ MDDISDRV V2.05 ══════ Ziel-CPU:   V20/----- ══[inst. CPU:   V20/-----]═════╗
  2667.     ║ 3484:014D  FA                   CLI                                 [ 8086]+ ║
  2668.   ->║ 3484:014E  2E 3A 26 37 01       CS: CMP AH,B[$-0018]     ABS: 0137  [ 8086]+ ║
  2669.     ║ 3484:0153  75 3A                JNZ  $+003C              ABS: 018F  [ 8086]+ ║
  2670.     ║ 3484:0155  3C 00                CMP AL,00 ; =  0 = 0000_0000xB      [ 8086]+ ║
  2671.     ║ 3484:0157  75 05                JNZ  $+0007              ABS: 015E  [ 8086]+ ║
  2672.     ║ 3484:0159  E8 AE 00             CALL $+00B1              ABS: 020A  [ 8086]+ ║
  2673.     ║ 3484:015C  EB 31                JMP  $+0033              ABS: 018F  [ 8086]+ ║
  2674.     ║ 3484:015E  2E 80 3E 40 01 00    CS: CMP B[$-001F],00     ABS: 0140  [ 8086]+ ║
  2675.     ║ 3484:0164  74 29                JZ   $+002B              ABS: 018F  [ 8086]+ ║
  2676.     ║ 3484:0166  3C 01                CMP AL,01 ; =  0 = 0000_0001xB      [ 8086]+ ║
  2677.     ╟─ akt. Stack-Element:  0 ── Disp. Code: R Daten: R ─[BPuWRfapK]──[lpt1, 55]───╢
  2678.     ║                                                                              ║
  2679.     ╟─ Register:  CS: 3484 DS: 3484 ES: 3484 SS: 3484 GS: 0000 FS: 0000 HB: 0000 ──╢
  2680.     ╠══seg:off══╤ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F ╤0123456789ABCDEF╣
  2681.     ║ 3484:0137 │ D1 09 12 90 23 32 0E 90-23 FF 33 02 4D 02 54 02 │╤..É#2.É# 3.M.T.║
  2682.     ║                            < Tastenbelegung >                                ║
  2683.     ╚══════════════════════[ (c) 1991 - 1992 Bernd Schemmer ]══════════════════════╝
  2684.  
  2685.     ────────────────────────────────────────────────────────────────────────────────
  2686.     Abb. 8 - Anzeige im Disassembler-Modus mit relativer Angabe aller
  2687.              Offsets und Displacements
  2688.  
  2689.  
  2690.  
  2691.  
  2692.  
  2693.  
  2694.  
  2695.  
  2696.  
  2697.  
  2698.  
  2699.     ────────────────────────────────────────────────────────────────────────────────
  2700.                                                                         Seite   40
  2701.  
  2702.  
  2703.  
  2704.     Der Wert  des Instruktion-Pointers wird in diesem Modus durch das
  2705.     Zeichen '$' repräsentiert. Der Wert des  Instruktion-Pointers ist
  2706.     immer  der  Offset des ersten  Bytes des JMP- oder  CALL-Befehls.
  2707.     Segment-Prefixe werden nicht berücksichtigt. (Dies entspricht der
  2708.     Philosophie des Assemblers A86, s.u.).
  2709.     Zur Information wird der Absolut-Wert der Adresse in diesem Modus
  2710.     als Kommentar hinter dem Befehl ausgegeben  (aber nur, falls noch
  2711.     genügend Platz in der Zeile vorhanden ist).
  2712.  
  2713.     Hinweis:  Die Displacements in den Opcodes sind immer relativ zum
  2714.               ersten  Byte der  folgenden Instruktion bzw. zum ersten
  2715.               Prefix der folgenden Instruktion falls vorhanden.
  2716.  
  2717.     Die Offsets von Speicheroperanden, deren Adresse ohne Basis- oder
  2718.     Index-Register  angegeben  ist,  können  ebenfalls  als  relative
  2719.     Offsets ausgegeben werden. [siehe Abb. 8]
  2720.  
  2721.  
  2722.     Der  Modus  für die Anzeige von  Offsets kann einzeln für Offsets
  2723.     von Speicheroperanden und für Displacements  geändert werden. Der
  2724.     aktuelle Modus wird im Disassembler- oder  Assembler-Modus  immer
  2725.     in der  Statuszeile angezeigt. Geändert  werden kann er  über die
  2726.     Taste <ALT-F3>. Durch  mehrmaliges Betätigen  der Taste  <ALT-F3>
  2727.     können alle möglichen Kombinationen eingestellt werden.
  2728.  
  2729.  
  2730.     Der Schalter B
  2731.  
  2732.     Der Schalter  B  bestimmt, ob vor der Funktion 'Folge dem Befehl'
  2733.     die aktuelle  Adresse automatisch auf den Adressen-Stack  gepusht
  2734.     wird (Wert 'B') oder nicht (Wert 'b').
  2735.  
  2736.     Der Schalter kann über die Taste <CTRL-B> umgeschaltet werden.
  2737.  
  2738.     Falls der Schalter auf 'b' steht ist, ist die  Wirkung der Tasten
  2739.     <CursorLeft>, <ALT-CursorLeft> und <Backspace> äquivalent und die
  2740.     Taste <CursorRight> ist gesperrt.
  2741.  
  2742.  
  2743.     Der Schalter P
  2744.  
  2745.     Der Schalter  P  bestimmt,  ob Prefixe  vor dem  aktuellen Befehl
  2746.     (Wert 'P') oder als einzelne Befehle ausgegeben werden.(Wert 'p')
  2747.  
  2748.     Der Schalter kann über die Taste <CTRL-P> umgeschaltet werden.
  2749.  
  2750.     Beachtet werden muß, daß  Segment-Prefixe von der Funktion 'Folge
  2751.     dem  Befehl'  NICHT  berücksichtigt  werden,  falls  Prefixe  als
  2752.     einzelne Befehle ausgegeben werden.
  2753.  
  2754.  
  2755.  
  2756.  
  2757.  
  2758.  
  2759.     ────────────────────────────────────────────────────────────────────────────────
  2760.                                                                         Seite   41
  2761.  
  2762.  
  2763.  
  2764.     Der Schalter U
  2765.  
  2766.     Der  Schalter  U  bestimmt,  ob der  Disassembler bei unbekannten
  2767.     Opcodes nur ein Byte (Wert 'u') oder 2 Byte (= 1 Wort,  Wert 'U')
  2768.     als unbekannten Befehl interpretiert.
  2769.  
  2770.     Der Schalter kann über die Taste <CTRL-U> umgeschaltet werden.
  2771.  
  2772.  
  2773.     Der Schalter R
  2774.  
  2775.     Der Schalter  R  bestimmt, ob die Anzeige im Dump-Modus  kontinu-
  2776.     ierlich upgedatet werden soll (Wert 'R') oder nicht (Wert 'r').
  2777.  
  2778.     Der Schalter kann über die Tasten <CTRL-R> oder <F9> umgeschaltet
  2779.     werden.
  2780.  
  2781.  
  2782.     Der Schalter W
  2783.  
  2784.     Der Schalter W bestimmt, ob WAIT-Befehle vor Coprozessor-Befehlen
  2785.     bei  einer  Ziel-CoCPU  ab  dem 80287  als Teil des  Coprozessor-
  2786.     Befehls  (Wert 'w')  oder als  einzelne  Befehle angesehen werden
  2787.     (Wert 'W').
  2788.  
  2789.     Der Schalter kann über die Taste <CTRL-W> umgeschaltet werden.
  2790.  
  2791.     WAIT-Befehle sind für Coprozessoren ab dem 80287 eigentlich nicht
  2792.     mehr nötig.  Falls als  Ziel-CoCPU ein 8087 angegeben ist, werden
  2793.     WAIT-Befehle immer als Teil des Coprozessor-Befehls angesehen.
  2794.  
  2795.  
  2796.     Der Schalter A
  2797.  
  2798.     Der  Schalter A  bestimmt,  ob beim Sichern von Speicherbereichen
  2799.     vorhandene Dateien überschrieben (Wert 'a') oder verlängert (Wert
  2800.     'A') werden.
  2801.     Der Schalter gilt auch für virtuelle Drucker! (s.u.)
  2802.  
  2803.     Der Schalter kann über die Taste <CTRL-A> umgeschaltet werden.
  2804.  
  2805.  
  2806.     Der Schalter F
  2807.  
  2808.     Der  Schalter F bestimmt, ob  Dateien bzw.  Ausdrucke  formatiert
  2809.     (Wert 'F') werden oder nicht (Wert 'f').
  2810.  
  2811.     Der Schalter kann über die Taste <CTRL-F> umgeschaltet werden.
  2812.  
  2813.  
  2814.  
  2815.  
  2816.  
  2817.  
  2818.  
  2819.     ────────────────────────────────────────────────────────────────────────────────
  2820.                                                                         Seite   42
  2821.  
  2822.  
  2823.  
  2824.     Der Schalter L
  2825.  
  2826.     Durch den Schalter  L  kann der vom Disassembler verwendete Algo-
  2827.     rithmus zur  Ermittlung des  vorherigen  Befehls beim  Rückwärts-
  2828.     scrollen bestimmt werden.
  2829.  
  2830.     Hierfür stehen 3 Möglichkeiten zur Verfügung:
  2831.  
  2832.         1. Der Disassembler sucht den längsten Befehl  vor der Start-
  2833.            Adresse (Wert 'l')
  2834.  
  2835.         2. Der Disassembler sucht den kürzesten Befehl vor der Start-
  2836.            Adresse (Wert 's')
  2837.  
  2838.         3. Der  Disassembler  ermittelt  den Befehl  vor  der  Start-
  2839.            Adresse seitenweise (Wert 'p')
  2840.            In  diesem  Modus  wird  vom  Offset der  Start-Adresse 32
  2841.            subtrahiert  und von dieser Adresse  dann nach vorne  dis-
  2842.            assembliert bis  der Befehl vor der Start-Adresse erreicht
  2843.            ist.
  2844.  
  2845.     Der Schalter kann über die Taste <CTRL-L> geändert werden.
  2846.  
  2847.     Je  nach der Art des aktuellen Codes kann einer der 3 Algorithmen
  2848.     der Beste sein. Falls es sich z.B. um überwiegend kürzere Opcodes
  2849.     handelt, ist der Algorithmus 2 zu wählen,  handelt  es sich  aber
  2850.     um überwiegend  längere Opcodes, so  ist der Algorithmus 1 vorzu-
  2851.     ziehen. Im allgemeinen sollte die Algorithmus 3 die besten Ergeb-
  2852.     nisse liefern.
  2853.  
  2854.     Falls  kein korrekter Befehl vor der Start-Adresse gefunden wird,
  2855.     wird die Start-Adresse in allen drei Modi um 2 vermindert.
  2856.  
  2857.     Sollte der Disassembler beim Rückwärts-Scrollen  den Anfang eines
  2858.     Befehls  nicht korrekt  erkennen,  kann über die  Tasten <+> bzw.
  2859.     <CTRL-CursorDown> und <-> bzw.  <CTRL-CursorUp>  der  Offset  der
  2860.     Start-Adresse in 1-Byte-Schritten korrigiert werden.
  2861.  
  2862.  
  2863.  
  2864.  
  2865.  
  2866.  
  2867.  
  2868.  
  2869.  
  2870.  
  2871.  
  2872.  
  2873.  
  2874.  
  2875.  
  2876.  
  2877.  
  2878.  
  2879.     ────────────────────────────────────────────────────────────────────────────────
  2880.                                                                         Seite   43
  2881.  
  2882.  
  2883.  
  2884.     Der Schalter K
  2885.  
  2886.     Der Schalter K legt fest, ob Kommentare ausgegeben  werden sollen
  2887.     (Wert: 'K') oder nicht (Wert: 'k').
  2888.  
  2889.     Falls der  Schalter K  auf 'k'  steht werden  folgende Kommentare
  2890.     NICHT ausgegeben:
  2891.  
  2892.     - unbekannte Opcodes im binären Format
  2893.     - die Felder von unbekannte ESC-Opcodes im binären Format
  2894.     - der Wert von immediate Bytes in dezimalen, binärem und ASCII-
  2895.       Format
  2896.     - der Wert von immediate Words in dezimalen Format
  2897.     - das Ziel für Verzweigungsbefehle
  2898.  
  2899.     Der Schalter kann über die Taste <CTRL-K> umgeschaltet werden.
  2900.  
  2901.  
  2902.     Der Schalter Q
  2903.  
  2904.     Über den Schalter Q können die akustischen Ausgaben des Disassem-
  2905.     blers ein-  bzw.  ausgestellt  werden.  Der  Wert  des  Schalters
  2906.     wird nicht angezeigt.
  2907.  
  2908.  
  2909.  
  2910.  
  2911.  
  2912.  
  2913.  
  2914.  
  2915.  
  2916.  
  2917.  
  2918.  
  2919.  
  2920.  
  2921.  
  2922.  
  2923.  
  2924.  
  2925.  
  2926.  
  2927.  
  2928.  
  2929.  
  2930.  
  2931.  
  2932.  
  2933.  
  2934.  
  2935.  
  2936.  
  2937.  
  2938.  
  2939.     ────────────────────────────────────────────────────────────────────────────────
  2940.                                                                         Seite   44
  2941.  
  2942.  
  2943.  
  2944.     Sichern von Speicherbereichen
  2945.     ─────────────────────────────
  2946.  
  2947.  
  2948.     Allgemeines zum Sichern von Speicherbereichen
  2949.     ─────────────────────────────────────────────
  2950.  
  2951.     Der  Disassembler kann  auch  Speicherbereiche  in  verschiedenen
  2952.     Formaten in einer Datei sichern oder ausdrucken.
  2953.     Da die Ausgabe von Speicherbereichen in eine  Datei bzw. der Aus-
  2954.     druck über das Betriebssystem durchgeführt wird, darf hierfür DOS
  2955.     nicht aktiv sein.
  2956.  
  2957.     Der Disassembler  überprüft deshalb vor der Ausgabe, ob DOS aktiv
  2958.     ist. Ist dies der Fall,  wird eine  Fehlermeldung  ausgegeben und
  2959.     die Funktion  abgebrochen. In diesem Fall sollte der Disassembler
  2960.     über die Taste <ALT-F5>  verlassen werden  und nach  dem  automa-
  2961.     tischen Neuaufruf von MDEBUG sobald DOS nicht aktiv ist die Funk-
  2962.     tion nochmal aufgerufen werden.
  2963.  
  2964.     Gesichert bzw. gedruckt  wird immer der Speicherbereich  zwischen
  2965.     den Markern 1 und 2. Diese müssen daher vorher gesetzt werden. Da
  2966.     maximal ein Segment auf einmal gesichert bzw. ausgedruckt  werden
  2967.     kann,  müssen die  Marker 1 und 2  zudem denselben  Wert für  das
  2968.     Segment besitzen.
  2969.  
  2970.     Eine bestehende Datei wird, je  nach dem  Wert  des  Schalters A,
  2971.     überschrieben oder verlängert.  Ob eine neue  Datei erstellt oder
  2972.     eine bestehende Datei verlängert wird, ist auch aus den Meldungen
  2973.     des  Disassemblers  während  und  nach  dem  Bearbeiten der Datei
  2974.     ersichtlich. Jede Datei-Ausgabe und jeder Ausdruck wird mit einem
  2975.     Header versehen.
  2976.  
  2977.     Falls der Schalter F auf  'F' steht, wird die  Datei-Ausgabe bzw.
  2978.     der  Ausdruck seitenweise  formatiert. Die maximale Anzahl Zeilen
  2979.     pro  Seite  für die  Seitenformatierung  wird  in der Statuszeile
  2980.     angezeigt; sie  kann  über die Tasten <>>, <<> und <#>  verändert
  2981.     werden. <<> vermindert die aktuelle  Anzahl  um 5, <>> erhöht die
  2982.     aktuelle Anzahl um 5 und <#> erhöht die aktuelle Anzahl um 1.
  2983.  
  2984.     Während des  Bearbeitens einer  Datei bzw. des  Ausdrucks wird in
  2985.     der letzten Zeile des Windows eine Laufzeitanzeige ausgegeben.
  2986.     Die Dateiausgabe bzw. der Ausdruck kann  jederzeit über die Taste
  2987.     <ESC> abgebrochen werden.
  2988.  
  2989.  
  2990.  
  2991.  
  2992.  
  2993.  
  2994.  
  2995.  
  2996.  
  2997.  
  2998.  
  2999.     ────────────────────────────────────────────────────────────────────────────────
  3000.                                                                         Seite   45
  3001.  
  3002.  
  3003.  
  3004.     Alle Fehler  (auch Hardware-Fehler) beim Sichern bzw. Ausdruckens
  3005.     eines Speicherbereichs  werdem vom  Disassembler  abgefangen. Ein
  3006.     Fehler führt immer zum Abbruch der Funktion.
  3007.  
  3008.     Nach  dem Ende der  Dateibearbeitung bzw. des Ausdrucks wird eine
  3009.     Meldung über den Erfolg oder  Mißerfolg der Bearbeitung inclusive
  3010.     des  Offsets des ersten Bytes nach dem letzten bearbeitenden Byte
  3011.     ausgegeben. Falls ein DOS-Fehler  aufgetreten ist,  wird auch die
  3012.     Nummer des DOS-Fehlers angezeigt.
  3013.  
  3014.     Möglich sind folgende (DOS-)Fehlernummern:
  3015.  
  3016.         ┌────────┬─────────────────────────────────────┐
  3017.         │ Nummer │ Bedeutung                           │
  3018.         ├────────┼─────────────────────────────────────┤
  3019.         │   03h  │ Pfad nicht gefunden                 │
  3020.         │   04h  │ Keine freies Handle mehr vorhanden  │
  3021.         │   05h  │ Zugriff abgelehnt                   │
  3022.         │   0Ch  │ Fehlerhafter Zugriffsmodus          │
  3023.         │   13h  │ Diskette ist schreibgeschützt       │
  3024.         │   15h  │ Laufwerk nicht bereit               │
  3025.         ├────────┼── Erweiterungen der Fehlernummern ──┤
  3026.         │ FFFEh  │ Drucker nicht bereit                │
  3027.         │ FFFFh  │ Diskette ist voll                   │
  3028.         └────────┴─────────────────────────────────────┘
  3029.  
  3030.     Unter besonderen Umständen können möglicherweise auch andere DOS-
  3031.     Fehler auftreten.
  3032.  
  3033.     Eine eventuell nur teilweise erstellte Datei wird nicht gelöscht.
  3034.  
  3035.     Beachtet  werden muß,  daß der Disassembler für die Dateibearbei-
  3036.     tung und  den  Ausdruck  das  PSP  des von  MDEBUG unterbrochenen
  3037.     Prozesses benutzt.
  3038.  
  3039.  
  3040.  
  3041.  
  3042.  
  3043.  
  3044.  
  3045.  
  3046.  
  3047.  
  3048.  
  3049.  
  3050.  
  3051.  
  3052.  
  3053.  
  3054.  
  3055.  
  3056.  
  3057.  
  3058.  
  3059.     ────────────────────────────────────────────────────────────────────────────────
  3060.                                                                         Seite   46
  3061.  
  3062.  
  3063.  
  3064.     Sichern von Speicherbereichen in eine Datei
  3065.     ───────────────────────────────────────────
  3066.  
  3067.     Speicherbereiche können im Disassembler in verschiedenen Formaten
  3068.     in eine Datei gesichert werden.
  3069.  
  3070.     Der Name für die Datei setzt sich dabei folgendermaßen zusammen:
  3071.  
  3072.     ────────────────────────────────────────────────────────────────────────────────
  3073.  
  3074.     ┌───────────────────────────────────────────────────────────────┐
  3075.     │                                                               │
  3076.     │      ┌─ Offset des 1. Bytes des zu sichernden                 │
  3077.     │      │  Speicherbereichs in hexadezimalem Format              │
  3078.     │     ┌┴─┐                                                      │
  3079.     │ ssssoooo.xxx                                                  │
  3080.     │ └┬─┘     └┬┘                                                  │
  3081.     │  │        │                                                   │
  3082.     │  │        └── Typ der zu erstellenden/verlängernden Datei,    │
  3083.     │  │            folgende Typen sind möglich:                    │
  3084.     │  │            DIS - die Datei enthält disassemblierten Code   │
  3085.     │  │            DMP - die Datei enthält einen Speicherdump      │
  3086.     │  │            DAT - die Datei enthält 'db'-Befehle für einen  │
  3087.     │  │                  Speicherbereich                           │
  3088.     │  │                                                            │
  3089.     │  └─ Segment des zu sichernden Speicherbereichs im             │
  3090.     │     hexadezimalem Format                                      │
  3091.     │                                                               │
  3092.     └───────────────────────────────────────────────────────────────┘
  3093.  
  3094.     ────────────────────────────────────────────────────────────────────────────────
  3095.     Abb. 9 - Aufbau eines Dateinamens
  3096.  
  3097.  
  3098.     Die Datei wird immer im aktuellen Directory erstellt.
  3099.  
  3100.     Zur Sicherung  eines Speicherbereichs  stehen folgende Tasten zur
  3101.     Verfügung:
  3102.  
  3103.     Die Taste <F6> veranlasst  den Disassembler  den  Speicherbereich
  3104.     zwischen  den Markern 1 und 2  als  disassemblierten Code in eine
  3105.     Datei zu sichern.
  3106.     Je nach aktuellem  Modus geschieht dies im  Disassembler- oder im
  3107.     Assembler-Modus. Der Aufbau der Zeilen der Datei ist dabei analog
  3108.     dem Aufbau der Zeilen im entsprechenden  Modus im Window  (ausge-
  3109.     nommen die Richtungspfeile für  Sprungbefehle, die nicht mit aus-
  3110.     gegeben werden.)
  3111.     Im Assembler-Modus werden zudem alle Header als Kommentare in die
  3112.     Datei geschrieben.
  3113.  
  3114.  
  3115.  
  3116.  
  3117.  
  3118.  
  3119.     ────────────────────────────────────────────────────────────────────────────────
  3120.                                                                         Seite   47
  3121.  
  3122.  
  3123.  
  3124.     Die Taste <SHIFT-F6>  führt  zur  Sicherung  des Speicherbereichs
  3125.     zwischen den Markern 1 und 2 als Speicherdump in eine Datei. Auch
  3126.     hier entspricht der Aufbau der Zeilen in der Datei dem Aufbau der
  3127.     Zeilen im Window im Dump-Modus.
  3128.  
  3129.     Die  Taste  <CTRL-F6>  veranlasst  den Disassembler den Speicher-
  3130.     bereich zwischen den  Markern 1 und 2 über  'db'-Befehle  in eine
  3131.     Datei zu schreiben. [siehe Abb. 10]
  3132.  
  3133.     ────────────────────────────────────────────────────────────────────────────────
  3134.         ┌── Befehl                                                      ┌──Kommentar
  3135.     ┌───┴────────────────────────────────────────────────────────────┐ ┌┴───────┐
  3136.     db 0FA,02E,03A,026,037,001,075,03A,03C,000,075,005,0E8,0AE,000,0EB ;3484:014D
  3137.     ┌─ ┌──────────────────────────────────────────────────────────────  ┌────────
  3138.     │  │                            ┌───────────────────────────────────┘
  3139.     │  │                            └─ Adresse des Speicherbereichs als Kommentar
  3140.     │  │
  3141.     │  └── max. 16 Byte ab der angegebenen Adresse im hexadezimalen Format
  3142.     └──── Assembler-Befehl 'DB'
  3143.  
  3144.     ────────────────────────────────────────────────────────────────────────────────
  3145.     Abb. 10 - Aufbau der Zeilen einer .DAT-Datei
  3146.  
  3147.  
  3148.  
  3149.     Erstellen von Quelldateien für den A86
  3150.     ──────────────────────────────────────
  3151.  
  3152.     Falls der  Disassembler im Assembler-Modus ist und mindestens die
  3153.     Displacements von JMP- und CALL-Befehlen  relativ zum IP ausgege-
  3154.     ben werden, kann  die so erstellte  Datei ohne Änderungen vom A86
  3155.     übersetzt werden.
  3156.  
  3157.  
  3158.     Einschränkungen hierbei:
  3159.  
  3160.     ■ Bei Befehlen, die auf Speicheroperanden zugreifen, muß  jeweils
  3161.       der angegebene Offset überprüft werden.
  3162.  
  3163.     ■ Befehle, die  nur auf  einem oder  mehreren Prozessoren möglich
  3164.       sind (gekennzeichnet durch '*'  bzw. '+*') müssen jeweils über-
  3165.       prüft werden.
  3166.  
  3167.  
  3168.  
  3169.  
  3170.  
  3171.  
  3172.  
  3173.  
  3174.  
  3175.  
  3176.  
  3177.  
  3178.  
  3179.     ────────────────────────────────────────────────────────────────────────────────
  3180.                                                                         Seite   48
  3181.  
  3182.  
  3183.  
  3184.     ■ Falls WAIT-Befehle als einzelne  Befehle ausgegeben  werden und
  3185.       Coprozessorbefehle  im zu sichernden Speicherbereich vorkommen,
  3186.       muß in die erstellte Datei noch die Assembler-Direktive
  3187.  
  3188.            '.287 '
  3189.  
  3190.       eingefügt werden.
  3191.       Ansonsten  fügt der  A86 zusätzliche unnötige WAIT-Befehle ein.
  3192.  
  3193.     ■ Die neuen Befehle des 80386 (incl. des undokumentierten Befehls
  3194.       LOADALLD) beherrscht der  A86 nicht.  Diese müssen  von Hand zu
  3195.       'db'-Statements umcodiert oder  über eine Macro-Datei definiert
  3196.       werden.
  3197.  
  3198.     ■ Der Befehl 'LOADALL' (Opcode: 0F 05) des  80286 und  der Befehl
  3199.       'FFREEP i'  (Opcode DF r/m)  des 80287  sind dem  A86 ebenfalls
  3200.       nicht bekannt.
  3201.  
  3202.     ■ Beachtetet werden muß auch:
  3203.  
  3204.       Die  vom A86 aus der Quelldatei erstellte  Objektdatei ist zwar
  3205.       von der  Funktion her  identisch mit dem disassemblierten Code.
  3206.       In der Datei können aber andere Opcodes als im disassemblierten
  3207.       Speicherbereich enthalten sein.
  3208.  
  3209.       Dies hat zwei Gründe:
  3210.  
  3211.       Zum einen  optimiert  der  A86 beim Compilieren;  so ersetzt er
  3212.       z.B.  den Befehl 'LEA AX,[BX]'  durch  den  schnelleren  Befehl
  3213.       'MOV AX,BX'.  Und zum  anderen ist  der Befehlssatz  der 80x86-
  3214.       Prozessoren  redundant,  d.h.  für mehrere  Befehle  existieren
  3215.       verschiedene Opcodes.
  3216.       So kann (z.B.) der Befehl 'MOV AX,W[01200]' als 'A1 00 12' oder
  3217.       als '8B 06 00 12' codiert werden.
  3218.  
  3219.  
  3220.  
  3221.  
  3222.  
  3223.  
  3224.  
  3225.  
  3226.  
  3227.  
  3228.  
  3229.  
  3230.  
  3231.  
  3232.  
  3233.  
  3234.  
  3235.  
  3236.  
  3237.  
  3238.  
  3239.     ────────────────────────────────────────────────────────────────────────────────
  3240.                                                                         Seite   49
  3241.  
  3242.  
  3243.  
  3244.     Ausgabe von Speicherbereichen auf den Drucker
  3245.     ─────────────────────────────────────────────
  3246.  
  3247.     Der  Disassembler  kann  Speicherbereiche  auch  direkt  auf  den
  3248.     Drucker ausgeben. Da hierfür ebenfalls die DOS-Funktionen benutzt
  3249.     werden, müssen die Anmerkungen unter 'Allgmeines zum  Sichern von
  3250.     Speicherbereichen' beachtet werden.
  3251.  
  3252.     Der aktuelle  Drucker für die Ausgabe kann über die Taste <ALT-P>
  3253.     zwischen LPT1, LPT2, LPT3 usw. bis LPT9 gewählt werden.
  3254.     Der aktuelle Drucker wird in der Statuszeile angezeigt.
  3255.  
  3256.     Zum Drucken können folgende Tasten verwendet werden:
  3257.  
  3258.     Die Taste <F7>  führt  zum  Ausdruck  des  disassemblierten Codes
  3259.     zwischen den  Markern 1 und 2. Je nach  dem  aktuellen Modus wird
  3260.     dabei der  Zeilenaufbau der  Zeilen im Disassembler-Modus oder im
  3261.     Assembler-Modus benutzt.
  3262.  
  3263.     Die  Taste  <SHIFT-F7>  führt  zum Ausdruck  des Speicherbereichs
  3264.     zwischen den Markern 1 und 2  als Dump.  Auch hier entspricht der
  3265.     Aufbau  der gedruckten Zeilen  dem Aufbau der Zeilen im Window im
  3266.     Dump-Modus.
  3267.  
  3268.     Über die Taste <CTRL-F7> kann  der  Speicherbereichs zwischen den
  3269.     Markern 1 und 2 als  'db'-Befehle ausgedruckt werden.  Der Aufbau
  3270.     der Zeilen ist dabei analog zur Ausgabe der Taste <CTRL-F6>.
  3271.  
  3272.     Beachtet werden muß aber folgendes:
  3273.  
  3274.     Falls der aktuelle  Drucker z.B.  'LPT4' ist, für LPT4  aber kein
  3275.     Einheitentreiber  existiert,  erstellt  DOS  eine  Datei  mit dem
  3276.     Namen  LPT4  im aktuellen  Directory.  Hierbei  gelten  dann alle
  3277.     Bedingungen wie bei der  Ausgabe in eine  Datei (mit Ausnahme der
  3278.     Wahl des Dateinamens, s.o.).
  3279.  
  3280.     Da für  LPT4 bis LPT9  in den  meisten  Systemen  kein Einheiten-
  3281.     Treiber vorhanden ist, können diese deshalb als virtuelle Drucker
  3282.     benutzt werden (falls der Schalter A auf 'A' steht).
  3283.  
  3284.     Eine weitere Einschränkung ist folgende:
  3285.  
  3286.     Der Disassembler  überprüft mit  den IOCTL-Funktionen 0 und 7 des
  3287.     Interrupts  21h ob der  angesprochene  Drucker zur Ausgabe bereit
  3288.     ist.  Verschiedene  Einheitentreiber  für  Drucker erkennen  aber
  3289.     nicht korrekt ob ein betriebsbereiter Drucker vorhanden ist.  Der
  3290.     Disassembler gibt in diesem Fall eine  Erfolgs-Meldung aus obwohl
  3291.     keine Ausgabe erfolgte.
  3292.  
  3293.  
  3294.  
  3295.  
  3296.  
  3297.  
  3298.  
  3299.     ────────────────────────────────────────────────────────────────────────────────
  3300.                                                                         Seite   50
  3301.  
  3302.  
  3303.  
  3304.     Zusammenfassung der Tastenbelegung im Disassembler
  3305.     ──────────────────────────────────────────────────
  3306.  
  3307.     ┌────────────────────┬─────────────────────────────────────┐
  3308.     │     Taste(n)       │ Bedeutung                           │
  3309.     ╞════════════════════╪═════════════════════════════════════╡
  3310.     │               <F1> │ akt. Seite der Online-Hilfe anzeigen│
  3311.     │                <O> │ 2. Seite der Online-Hilfe anzeigen  │
  3312.     │                    │                                     │
  3313.     │      <CursorDown>  │                                     │
  3314.     │<CursorUp> <Blank>  │ Speicherbereich scrollen            │
  3315.     │<PgDn> <PgUp> <CR>  │ Speicherbereich scrollen            │
  3316.     │<+> <CTRL-CursorUp> │ Offset um 1 Byte erhöhen            │
  3317.     │<-><CTRL-CursorDown>│ Offset um 1 Byte vermindern         │
  3318.     │               <A>  │ Offset um 2 Byte vermindern         │
  3319.     │               <W>  │ Offset um 2 Byte erhöhen            │
  3320.     │               <0>  │ zur letzten Position springen       │
  3321.     │          <J> <F4>  │ neue Start-Adresse eingeben         │
  3322.     │               <I>  │ Interrupt-Routine disassemblieren   │
  3323.     │          <CTRL-N>  │ Start-Adresse normalisieren         │
  3324.     │                    │                                     │
  3325.     │           <ALT-0>  │ alle Marker löschen                 │
  3326.     │       <ALT-1> ...  │                                     │
  3327.     │           <ALT-9>  │ Marker # setzen                     │
  3328.     │       <1> ... <9>  │ Marker # anspringen                 │
  3329.     │                    │                                     │
  3330.     │          <CTRL-T>  │ akt. Zeile zur ersten Zeile machen  │
  3331.     │            <Home>  │ zur ersten Zeile des Windows        │
  3332.     │             <End>  │ zur letzten Zeile des Windows       │
  3333.     │                    │                                     │
  3334.     │          <Delete>  │ oberste Stack-Adresse löschen       │
  3335.     │          <CTRL-D>  │ gesamten Adressen-Stack löschen     │
  3336.     │          <Insert>  │ akt. Adresse auf den Stack pushen   │
  3337.     │ <SHIFT-Tab> <Tab>  │ Stackzeile scrollen                 │
  3338.     │     <CursorRight>  │ neue Start-Adresse vom Stack popen  │
  3339.     │      <CursorLeft>  │ Befehl folgen mit vorherigen push   │
  3340.     │  <ALT-CursorLeft>  │ Befehl folgen (ohne Push)           │
  3341.     │       <Backspace>  │ Befehl folgen (ohne Push)           │
  3342.     │                    │                                     │
  3343.     │              <F2>  │ Ziel-CPU ändern                     │
  3344.     │        <SHIFT-F2>  │ Ziel-CoCPU ändern                   │
  3345.     │              <F3>  │ Anzeige-Modus ändern                │
  3346.     └────────────────────┴─────────────────────────────────────┘
  3347.  
  3348.  
  3349.  
  3350.  
  3351.  
  3352.  
  3353.  
  3354.  
  3355.  
  3356.  
  3357.  
  3358.  
  3359.     ────────────────────────────────────────────────────────────────────────────────
  3360.                                                                         Seite   51
  3361.  
  3362.  
  3363.  
  3364.     ┌────────────────────┬─────────────────────────────────────┐
  3365.     │     Taste(n)       │ Bedeutung                           │
  3366.     ╞════════════════════╪═════════════════════════════════════╡
  3367.     │         <CTRL-F3>  │ Anzeige-Modus für die letzten beiden│
  3368.     │                    │ Zeilen im Dump-Modus ändern         │
  3369.     │        <SHIFT-F3>  │ Assembler-Modus ein/ausschalten     │
  3370.     │          <ALT-F3>  │ Displacement-Modus ändern           │
  3371.     │          <CTRL-B>  │ Stackblocking ein/ausschalten       │
  3372.     │          <CTRL-L>  │ Modus für die Ermittlung der        │
  3373.     │                    │ vorherigen Instruktion umschalten   │
  3374.     │          <CTRL-P>  │ Prefixmodus wechseln                │
  3375.     │          <CTRL-U>  │ Modus für unbekannte Opcodes ändern │
  3376.     │          <CTRL-W>  │ Modus für WAIT-Befehle bei          │
  3377.     │                    │ Coprozessoren ab dem 80287 ändern   │
  3378.     │          <CTRL-R>  │ Refreshmodus für Dump-Zeilen ändern │
  3379.     │          <CTRL-K>  │ Kommentare ausgeben oder nicht      │
  3380.     │              <F9>  │ Refreshmodus für Dump-Zeilen ändern │
  3381.     │          <CTRL-Q>  │ Quiet-Modus ein- oder ausschalten   │
  3382.     │       <C>,<D>,<E>  │ best. Segment-Register editieren    │
  3383.     │       <S>,<G>,<F>  │ best. Segment-Register editieren    │
  3384.     │              <F5>  │ Segment-Register editieren          │
  3385.     │        <SHIFT-F5>  │ Segment-Register updaten            │
  3386.     │               <H>  │ Hilfsregister editieren             │
  3387.     │         <CTRL-F1>  │ Programm-Pause                      │
  3388.     │           <ALT-L>  │ letzte Meldung nochmal anzeigen     │
  3389.     │          <ALT-F9>  │ Window neu aufbauen                 │
  3390.     │       <CTRL-PgDn>  │ Window nach oben verschieben        │
  3391.     │       <CTRL-PgUp>  │ Window nach unten verschieben       │
  3392.     │        <CTRL-End>  │ Window nach ganz oben verschieben   │
  3393.     │       <CTRL-Home>  │ Window nach ganz unten verschieben  │
  3394.     │                    │                                     │
  3395.     │              <F6>  │ Code zwischen den Markern 1 und 2   │
  3396.     │                    │ in die Datei ssssoooo.DIS sichern   │
  3397.     │        <SHIFT-F6>  │ Dump zw. den Markern 1 und 2 in die │
  3398.     │                    │ Datei ssssoooo.DMP sichern          │
  3399.     │         <CTRL-F6>  │ Speicherbereich zwischen den Markern│
  3400.     │                    │ 1 und 2 als 'db'-Befehle in die     │
  3401.     │                    │ Datei ssssoooo.DAT sichern          │
  3402.     │                    │                                     │
  3403.     │              <F7>  │ Code zwischen den Markern 1 und 2   │
  3404.     │                    │ drucken                             │
  3405.     │        <SHIFT-F6>  │ Dump zwischen den Markern 1 und 2   │
  3406.     │                    │ drucken                             │
  3407.     │         <CTRL-F6>  │ Speicherbereich zwischen den Markern│
  3408.     │                    │ 1 und 2 als 'db'-Befehle drucken    │
  3409.     └────────────────────┴─────────────────────────────────────┘
  3410.  
  3411.  
  3412.  
  3413.  
  3414.  
  3415.  
  3416.  
  3417.  
  3418.  
  3419.     ────────────────────────────────────────────────────────────────────────────────
  3420.                                                                         Seite   52
  3421.  
  3422.  
  3423.  
  3424.     ┌────────────────────┬─────────────────────────────────────┐
  3425.     │     Taste(n)       │ Bedeutung                           │
  3426.     ╞════════════════════╪═════════════════════════════════════╡
  3427.     │               <<>  │ Anzahl der Zeilen/Seite um 5        │
  3428.     │                    │ vermindern                          │
  3429.     │               <>>  │ Anzahl der Zeilen/Seite um 5 erhöhen│
  3430.     │               <#>  │ Anzahl der Zeilen/Seite um 1 erhöhen│
  3431.     │           <ALT-P>  │ aktuellen Drucker wechseln          │
  3432.     │                    │                                     │
  3433.     │              <F8>  │ Suche eine Code-Referenz            │
  3434.     │        <SHIFT-F8>  │ Suche eine Daten-Referenz           │
  3435.     │         <CTRL-F8>  │ Letzte Code/Daten-Referenz-Suche    │
  3436.     │                    │ fortsetzen                          │
  3437.     │                    │                                     │
  3438.     │        <Q>, <ESC>  │ Disassembler verlassen              │
  3439.     │        <X>, <F10>  │ Disassembler und MDEBUG verlassen   │
  3440.     │          <ALT-F5>  │ Disassembler und MDEBUG verlassen   │
  3441.     │                    │ mit automatischen Neuaufruf von     │
  3442.     │                    │ MDEBUG falls DOS nicht aktiv ist    │
  3443.     │        <CTRL-F10>  │ Start-Adresse des Disassemblers in  │
  3444.     │                    │ die Register SE und OF übernehmen   │
  3445.     │                    │ und den Disassembler verlassen      │
  3446.     │         <ALT-F10>  │ Falls in der akt. Instruktion eine  │
  3447.     │                    │ Adresse ist, diese in die Register  │
  3448.     │                    │ SE und OF des Monitors übernehmen   │
  3449.     │                    │ und den Disassembler verlassen.     │
  3450.     └────────────────────┴─────────────────────────────────────┘
  3451.  
  3452.  
  3453.  
  3454.  
  3455.  
  3456.  
  3457.  
  3458.  
  3459.  
  3460.  
  3461.  
  3462.  
  3463.  
  3464.  
  3465.  
  3466.  
  3467.  
  3468.  
  3469.  
  3470.  
  3471.  
  3472.  
  3473.  
  3474.  
  3475.  
  3476.  
  3477.  
  3478.  
  3479.     ────────────────────────────────────────────────────────────────────────────────
  3480.                                                                         Seite   53
  3481.  
  3482.  
  3483.  
  3484.     Syntax für die Anzeige der Befehle
  3485.     ──────────────────────────────────
  3486.  
  3487.     Der Disassembler verwendet für die Anzeige der Befehle die Syntax
  3488.     und die Mnemonics des Assemblers A86.
  3489.  
  3490.     Der generelle Aufbau eines Befehl ist:
  3491.  
  3492.          {prefix1} {prefix2} mnemonic {op1} {,op2} {,op3}
  3493.  
  3494.     Alle  Angaben  außer  dem Mnemonic sind dabei optional. In  einer
  3495.     Zeile werden maximal 3 Prefixe oder 2 Prefixe und 1 Befehl ausge-
  3496.     geben.  Segment-Prefixe  werden in  der Form 'ss:' vor dem Befehl
  3497.     ausgegeben.
  3498.  
  3499.     Bei  Befehlen  mit impliziter Angabe des Typs des Operanden (z.B.
  3500.     'STOS') wird dieser durch ein angehängtes 'B' oder 'W' angezeigt.
  3501.  
  3502.     RET NEAR-Befehle werden  als einfaches  'RET' angezeigt, RET FAR-
  3503.     Befehle werden als 'RETF' ausgegeben.
  3504.  
  3505.     Bei den  Befehlen 'AAM' und 'AAD' ist das zweite Byte des Opcodes
  3506.     ein (undokumentierter) Operand des Befehls (nur für INTEL-CPUs!).
  3507.     Dieses wird deshalb,  falls es  ungleich 0Ah ist und die aktuelle
  3508.     Ziel-CPU nicht  der V20 ist, vom Disassembler  als Operand ausge-
  3509.     geben.  (0Ah ist  die Voreinstellung  für  das  zweite  Byte  des
  3510.     Opcodes)
  3511.  
  3512.     Hinter intrasegment JMP- und CALL-Befehlen  wird, falls ermittel-
  3513.     bar,  durch  einen  Pfeil jeweils  die 'Richtung'  des  JMP- bzw.
  3514.     CALL-Befehls angezeigt.
  3515.  
  3516.     Für  undokumentierte  Opcodes  werden die  Mnemonics  aus der c't
  3517.     benutzt (siehe auch 'OPCODES.PRT').
  3518.  
  3519.     Für  immediate  Bytes und immediate Words (z.B. bei 'MOV AL,065')
  3520.     wird, je nach der Art des Befehls (Operandentransport, Arithmetik
  3521.     oder Logik) und falls noch genügend  Platz in der  Zeile ist, der
  3522.     ASCII-Code, der dezimale  Wert  und der binäre Wert des Bytes als
  3523.     Kommentar mit ausgegeben.
  3524.  
  3525.     Falls  ein Verzweigungsbefehl  ( CALL, JMP, INT, etc.)  auf einen
  3526.     der Befehle RET, RETF, IRET oder HLT zeigt, wird  dies hinter dem
  3527.     Verzweigungsbefehl als Kommentar angezeigt.
  3528.  
  3529.  
  3530.  
  3531.  
  3532.  
  3533.  
  3534.  
  3535.  
  3536.  
  3537.  
  3538.  
  3539.     ────────────────────────────────────────────────────────────────────────────────
  3540.                                                                         Seite   54
  3541.  
  3542.  
  3543.  
  3544.     Mnemonics für die Opcodes des 80386
  3545.     ───────────────────────────────────
  3546.  
  3547.     Für  die neuen  Befehle des  80386 werden  die Mnemonics  aus dem
  3548.     'Programmers Reference Manual' für den 80386 von INTEL verwendet.
  3549.  
  3550.     Die neuen  Prefixe des  80386 werden  vom Disassembler folgender-
  3551.     maßen berücksichtigt:
  3552.  
  3553.     Die neuen Segment-Prefixe  'FS:' und 'GS:' werden wie die anderen
  3554.     Segment-Prefixe ausgegeben und behandelt.
  3555.  
  3556.     Das Operand-Size-Prefix wird vom Disassembler erkannt und als
  3557.  
  3558.         db 66h      ; Operandenprefix
  3559.  
  3560.     ausgegeben;  das Adress-Size-Prefix wird vom Disassembler erkannt
  3561.     und als
  3562.  
  3563.         db 67h      ; Adressenprefix
  3564.  
  3565.     ausgegeben.
  3566.  
  3567.     Die beiden  Prefixe werden vom  Disassembler bei  der Decodierung
  3568.     aber nicht berücksichtigt. D.h. falls es  sich um korrekten  Code
  3569.     handelt, ist mindestens der folgende Befehl falsch decodiert!
  3570.  
  3571.     Die  neuen Adressierungsarten  für  Speicheroperanden  des  80386
  3572.     werden vom Disassembler ebenfalls nicht berücksichtigt.
  3573.  
  3574.  
  3575.  
  3576.  
  3577.  
  3578.  
  3579.  
  3580.  
  3581.  
  3582.  
  3583.  
  3584.  
  3585.  
  3586.  
  3587.  
  3588.  
  3589.  
  3590.  
  3591.  
  3592.  
  3593.  
  3594.  
  3595.  
  3596.  
  3597.  
  3598.  
  3599.     ────────────────────────────────────────────────────────────────────────────────
  3600.                                                                         Seite   55
  3601.  
  3602.  
  3603.  
  3604.     Ausgabe von ESC-Befehlen
  3605.     ────────────────────────
  3606.  
  3607.     ESC-Befehle,  d.h. Befehle  für den Coprozessor, die die aktuelle
  3608.     Ziel-CoCPU nicht beherrscht,  werden vom  Disassembler analog zur
  3609.     Vorgehensweise des Prozessors behandelt.  Da  ein Mnemonic  'ESC'
  3610.     nicht existiert, werden sie aber als 'db'-Befehle ausgegeben.
  3611.  
  3612.     Der Disassembler wertet  zur Ermittlung  der korrekten Länge  des
  3613.     Opcodes von ESC-Befehlen  das 'mod r/m'-Byte des  ESC-Befehls aus
  3614.     um die Länge des Befehls (2, 3 oder 4 Bytes) zu ermitteln.
  3615.     [siehe Abb. 11]
  3616.  
  3617.     ┌─────────────────────────────────────────────────────────────┐
  3618.     │                     zusätzlich falls im 'mod r/m'-Byte die  │
  3619.     │                     Adresse eines Speicheroperanden mit     │
  3620.     │                     Displacement codiert ist:               │
  3621.     │                                                             │
  3622.     │ 1. Byte    2. Byte   3. Byte  4. Byte                       │
  3623.     │ ┌──┴───┐ ┌────┴───┐  ┌──┴───┐ ┌──┴───┐                      │
  3624.     │ 11011xxx xx_xxx_xxx  xxxxxxxx xxxxxxxx                      │
  3625.     │ ├───┘├─┘ ├┘ ├─┘ ├─┘  └───────┼───────┘                      │
  3626.     │ │    │   │  │   │      Displacement (short: 1 Byte          │
  3627.     │ ESC  │  mod │   r/m              oder full: 2 Byte)         │
  3628.     │     var1    var2                                            │
  3629.     │                                                             │
  3630.     └─────────────────────────────────────────────────────────────┘
  3631.     Abb. 11 - Aufbau des Opcodes für den ESC-Befehl
  3632.  
  3633.  
  3634.     Falls  das  'mod'-Feld  im zweitem Byte  des ESC-Befehls ungleich
  3635.     11xB ist, ist im 'mod r/m'-Byte des ESC-Befehls die Adresse eines
  3636.     Speicheroperanden codiert.
  3637.  
  3638.     In  diesem Fall wird hinter dem  ESC-Befehl der Wert  der  Felder
  3639.     'var1' und 'var2' im  binärem Format ausgegeben  und bei der Aus-
  3640.     gabe des 'db'-Befehls werden die  eventuell dem  Opcode folgenden
  3641.     Bytes für das Displacement berücksichtigt. [siehe Abb. 12]
  3642.  
  3643.  
  3644.     ┌─────────────────────────────────────────────────────────────┐
  3645.     │                                                             │
  3646.     │ db 0DF,026, 034,012  ; ESC 111xB, 100xB                     │
  3647.     │    ┌──────  ┌──────        ┌──    ┌──                       │
  3648.     │    └ Opcode └ Disp.        └ var1 └ var2                    │
  3649.     │                                                             │
  3650.     └─────────────────────────────────────────────────────────────┘
  3651.     Abb. 12 - Ausgabe von unbekannten ESC-Opcodes mit einem
  3652.               Speicheroperanden
  3653.  
  3654.  
  3655.  
  3656.  
  3657.  
  3658.  
  3659.     ────────────────────────────────────────────────────────────────────────────────
  3660.                                                                         Seite   56
  3661.  
  3662.  
  3663.  
  3664.     Ist das  'mod'-Feld im zweitem Byte des  ESC-Befehls gleich 11xB,
  3665.     so ist im  'mod r/m'-Byte  des  ESC-Befehls kein  Speicheroperand
  3666.     codiert, der Befehl ist also nur 2 Byte lang.
  3667.     In diesem  Fall  wird hinter  dem ESC-Befehl der Wert  der Felder
  3668.     'var1', 'mod', 'var2' und 'r/m' im binärem  Format ausgegeben und
  3669.     im 'db'-Befehl nur der Opcode ausgegeben. [siehe Abb. 13]
  3670.  
  3671.     ┌─────────────────────────────────────────────────────────────┐
  3672.     │                                                             │
  3673.     │ db 0DF,0E0  ; ESC 111xB, 11_100_000xB                       │
  3674.     │    ┌──────        ┌──    ┌─ ┌── ┌──                         │
  3675.     │    └ Opcode       └ var1 │  │   └ r/m                       │
  3676.     │                          │  └ var2                          │
  3677.     │                          └ mod                              │
  3678.     │                                                             │
  3679.     └─────────────────────────────────────────────────────────────┘
  3680.     Abb. 13 - Ausgabe von unbekannten ESC-Opcodes ohne
  3681.               Speicheroperanden
  3682.  
  3683.  
  3684.  
  3685.     Behandlung von unbekannten Opcodes
  3686.     ──────────────────────────────────
  3687.  
  3688.     Unbekannte Opcodes werden als 'db'-Befehle ausgegeben.
  3689.  
  3690.     Zusätzlich werden bei  unbekannten Opcodes hinter dem 'db'-Befehl
  3691.     noch die vom  Befehl  belegten Bytes  in binärer Schreibweise als
  3692.     Kommentar ausgegeben.
  3693.  
  3694.     Unbekannte  Opcodes  werden  zusätzlich durch ein Fragezeichen im
  3695.     4 Feld der Zeile gekennzeichnet.
  3696.  
  3697.  
  3698.  
  3699.  
  3700.  
  3701.  
  3702.  
  3703.  
  3704.  
  3705.  
  3706.  
  3707.  
  3708.  
  3709.  
  3710.  
  3711.  
  3712.  
  3713.  
  3714.  
  3715.  
  3716.  
  3717.  
  3718.  
  3719.     ────────────────────────────────────────────────────────────────────────────────
  3720.                                                                         Seite   57
  3721.  
  3722.  
  3723.  
  3724.     Opcodes mit unmöglichen Operanden
  3725.     ─────────────────────────────────
  3726.  
  3727.     Verschiedene Opcodes  der  80x86-Prozessoren  sind nur  mit einem
  3728.     Speicheroperanden  als zweiten Operanden definiert. Aufgrund  des
  3729.     Aufbaus  des  'mod r/m'-Bytes ist  es aber möglich, diese Befehle
  3730.     mit einem Register als zweiten Operanden zu codieren.
  3731.     Alle mir  bekannten  Debugger und  Disassembler  decodieren diese
  3732.     Opcodes  falsch.  Der vorliegende  Disassembler  behandelt  diese
  3733.     Opcodes korrekt als unbekannte Opcodes.
  3734.  
  3735.     Dies betrifft folgende Opcodes:
  3736.  
  3737.     ┌────────────────┬─────────────────────────┐
  3738.     │  Opcode        │ Befehl                  │
  3739.     ╞════════════════╪═════════════════════════╡
  3740.     │  8D rw,eb      │ LEA rw,eb               │
  3741.     │  C4 r/m        │ LES rw,md               │
  3742.     │  C5 r/m        │ LDS rw,md               │
  3743.     │  FF r/m        │ CALL DWORD POINTER md   │
  3744.     │  FF r/m        │ JMP DWORD POINTER md    │
  3745.     ├────────────────┴─────────────────────────┤
  3746.     │  Opcodes ab dem 80186:                   │
  3747.     ├────────────────┬─────────────────────────┤
  3748.     │  62 r/m        │ BOUND rw,md             │
  3749.     ├────────────────┴─────────────────────────┤
  3750.     │  Opcodes ab dem 80286:                   │
  3751.     ├────────────────┬─────────────────────────┤
  3752.     │  0F 01 r/m     │ SGDT mem6               │
  3753.     │  0F 01 r/m     │ LGDT mem6               │
  3754.     │  0F 01 r/m     │ SIDT mem6               │
  3755.     │  0F 01 r/m     │ LIDT mem6               │
  3756.     ├────────────────┴─────────────────────────┤
  3757.     │  Opcodes ab dem 80386:                   │
  3758.     ├────────────────┬─────────────────────────┤
  3759.     │  0F B2 r/m     │ LSS rw,md               │
  3760.     │  0F B4 r/m     │ LFS rw,md               │
  3761.     │  0F B5 r/m     │ LGS rw,md               │
  3762.     └────────────────┴─────────────────────────┘
  3763.  
  3764.  
  3765.  
  3766.  
  3767.  
  3768.  
  3769.  
  3770.  
  3771.  
  3772.  
  3773.  
  3774.  
  3775.  
  3776.  
  3777.  
  3778.  
  3779.     ────────────────────────────────────────────────────────────────────────────────
  3780.                                                                         Seite   58
  3781.  
  3782.  
  3783.  
  3784.     Format von expliziten Werten
  3785.     ────────────────────────────
  3786.  
  3787.     Alle Werte ohne Format-Kennzeichen sind  hexadezimale Werte. Alle
  3788.     hexadezimalen Werte (außerhalb von Kommentaren)  werden mit  min-
  3789.     destens einer führenden Null angezeigt.
  3790.  
  3791.     Binäre Werte  sind durch  das angehängte Format-Kennzeichen  'xB'
  3792.     gekennzeichnet.  ASCII-Codes werden  durch ein  führendes und ein
  3793.     folgendes Hochkomma gekennzeichnet.
  3794.  
  3795.     Operanden,  die  direkt im  Opcode  enthalten sind werden je nach
  3796.     Größe mit mindestens 2 bzw. 4 Ziffern ausgegeben.
  3797.  
  3798.     Displacements  werden  immer als  vorzeichenbehaftete  Werte  mit
  3799.     mindestens 4 Ziffern ausgegeben.
  3800.  
  3801.  
  3802.  
  3803.     Format von Speicheroperanden
  3804.     ────────────────────────────
  3805.  
  3806.     Speicheroperanden  werden  durch  eckige  Klammern  '[]'  gekenn-
  3807.     zeichnet. Das Format eines Speicheroperanden wird dabei durch ein
  3808.     Zeichen vor dem Operanden angezeigt:
  3809.  
  3810.         ┌─────────┬────────────┐
  3811.         │         │ Länge des  │   Bei  Speicheroperanden  mit  einem
  3812.         │ Zeichen │ Operanden  │   anderen  Format (z.B. verschiedene
  3813.         ╞═════════╪════════════╡   Befehle  der  Coprozessoren)  wird
  3814.         │    B    │ Byte       │   als Format 'W' ausgegeben.
  3815.         │    W    │ Wort       │
  3816.         │    D    │ Doppelwort │
  3817.         │    Q    │ Qadwort    │
  3818.         │    T    │ 10 Byte    │
  3819.         └─────────┴────────────┘
  3820.  
  3821.  
  3822.  
  3823.  
  3824.  
  3825.  
  3826.  
  3827.  
  3828.  
  3829.  
  3830.  
  3831.  
  3832.  
  3833.  
  3834.  
  3835.  
  3836.  
  3837.  
  3838.  
  3839.     ────────────────────────────────────────────────────────────────────────────────
  3840.                                                                         Seite   59
  3841.  
  3842.  
  3843.  
  3844.     MDBSPDRV.COM
  3845.     ────────────
  3846.  
  3847.     MDBSPDRV.COM ist ein Kommandotreiber für MDEBUG zur Demonstration
  3848.     der Möglichkeiten von Kommandotreibern.
  3849.  
  3850.     Aufruf: MDBSPDRV {/Pnn} {/I} {/R} {/?} {@...}
  3851.  
  3852.     Parameter:
  3853.     (siehe 'Allgemeine Parameter für die Treiber')
  3854.  
  3855.  
  3856.  
  3857.     Befehle für den Interpreter
  3858.     ───────────────────────────
  3859.  
  3860.     MDBSPDRV stellt folgende neue Befehle für MDEBUG zur Verfügung:
  3861.  
  3862.  
  3863.     EX
  3864.  
  3865.     Der  EX-Befehl  führt,  abhängig  vom  Inhalt  des  Registers AX,
  3866.     folgende Aktionen aus:
  3867.  
  3868.          AX = 0 ->> keine weiteren Aktionen
  3869.  
  3870.          AX = 1 ->> MDEBUG verlassen, Neustart im Interpreter
  3871.  
  3872.          AX = 2 ->> MDEBUG verlassen mit automatischen Aufruf
  3873.                     von MDEBUG sobald DOS nicht aktiv ist
  3874.  
  3875.           sonst ->> Ausgabe einer Fehlermeldung
  3876.  
  3877.  
  3878.     MM
  3879.  
  3880.     Der MM-Befehl ist ein Macro für die folgende Befehlszeile:
  3881.  
  3882.          MOV ES,SE ^ MOV DI,OF ^ MOV DS,FS ^ MOV SI,OF
  3883.  
  3884.     Diese  wird sofort ausgeführt  und danach  aus dem  Eingabepuffer
  3885.     gelöscht.
  3886.  
  3887.  
  3888.  
  3889.  
  3890.  
  3891.  
  3892.  
  3893.  
  3894.  
  3895.  
  3896.  
  3897.  
  3898.  
  3899.     ────────────────────────────────────────────────────────────────────────────────
  3900.                                                                         Seite   60
  3901.  
  3902.  
  3903.  
  3904.     Da für die folgenden Befehle des  Treibers der  DOS-Interrupt 21h
  3905.     benutzt wird, können sie  nur bei gelöschtem Busy-Flag ausgeführt
  3906.     werden. Falls die Befehle  ausgeführt  werden konnten,  enden sie
  3907.     mit CF = 0. Trat  bei der  Befehlsausführung  ein Fehler auf, ist
  3908.     CF = 1 und das Register AX enthält den DOS-Fehlercode.
  3909.  
  3910.  
  3911.     MD dirname
  3912.  
  3913.     Erstellt ein neues Verzeichnis mit dem Namen 'dirname'.
  3914.  
  3915.  
  3916.     RD dirname
  3917.  
  3918.     Löscht das Verzeichnis mit dem Namen 'dirname'.
  3919.  
  3920.  
  3921.     CD {dirname}
  3922.  
  3923.     Wechselt das aktuelle Verzeichnis.
  3924.  
  3925.     Ist kein  Parameter angegeben ist, schreibt  der Befehl den Namen
  3926.     des  aktuellen Directorys  im aktuellen  Laufwerk in den Eingabe-
  3927.     puffer von MDEBUG.
  3928.  
  3929.  
  3930.     E? dateiname
  3931.  
  3932.     Überprüft, ob die angegebene Datei existiert.
  3933.     (CF = 0 ->> Datei existiert, CF = 1 ->> Datei existiert nicht)
  3934.  
  3935.  
  3936.     DE dateiname
  3937.  
  3938.     Löscht die angegebene Datei.
  3939.  
  3940.  
  3941.     RE altername,neuername
  3942.  
  3943.     Benennt die Datei altername in neuername um.
  3944.  
  3945.  
  3946.  
  3947.  
  3948.  
  3949.  
  3950.  
  3951.  
  3952.  
  3953.  
  3954.  
  3955.  
  3956.  
  3957.  
  3958.  
  3959.     ────────────────────────────────────────────────────────────────────────────────
  3960.                                                                         Seite   61
  3961.  
  3962.  
  3963.  
  3964.     Die nächsten  Befehle geben  das Ergebnis über eine Fehlermeldung
  3965.     zurück (d.h. sie enden immer mit einem Fehler):
  3966.  
  3967.  
  3968.     B?
  3969.  
  3970.     Der Befehl gibt den Status  des DOS-Break-Flags als Fehlermeldung
  3971.     aus.
  3972.  
  3973.  
  3974.     B0
  3975.  
  3976.     Dieser Befehl löscht das DOS-Break-Flag  und gibt eine entsprech-
  3977.     ende Meldung als Fehlermeldung aus.
  3978.  
  3979.  
  3980.     B1
  3981.  
  3982.     Dieser Befehl setzt  das DOS-Break-Flag  und gibt eine entsprech-
  3983.     ende Meldung als Fehlermeldung aus.
  3984.  
  3985.  
  3986.  
  3987.     Tastenbelegung im Monitor
  3988.     ─────────────────────────
  3989.  
  3990.     Der Treiber definiert zusätzlich folgende neue Tasten im Monitor:
  3991.  
  3992.     <CTRL-E>   - Synonym für <CursorUp>
  3993.  
  3994.     <CTRL-X>   - Synonym für <CursorDown>
  3995.  
  3996.     <CTRL-S>   - Synonym für <CursorLeft>
  3997.  
  3998.     <CTRL-F>   - Synonym für <CursorRight>
  3999.  
  4000.     <ALT-A>    - Lädt das aktuelle Speicherwort (also das auf dem der
  4001.                  Cursor steht) in das Register AX.
  4002.  
  4003.     <ALT-X>    - Verlassen von MDEBUG, Neustart im Monitor
  4004.  
  4005.     <ALT-Q>    - Verlassen von MDEBUG  mit automatischem Aufruf von
  4006.                  MDEBUG sobald DOS nicht aktiv ist.
  4007.  
  4008.     <ALT-C>    - Diese Taste führt zur Ausgabe eines Fehlertons.
  4009.  
  4010.  
  4011.  
  4012.  
  4013.  
  4014.  
  4015.  
  4016.  
  4017.  
  4018.  
  4019.     ────────────────────────────────────────────────────────────────────────────────
  4020.                                                                         Seite   62
  4021.  
  4022.  
  4023.  
  4024.     Tastenbelegung im Interpreter
  4025.     ─────────────────────────────
  4026.  
  4027.     Im Interpreter definiert der Treiber folgende neue Tasten:
  4028.  
  4029.     <CTRL-O>   - Setzt das Register OF auf 0
  4030.  
  4031.     <CTRL-S>   - Setzt das Register SE auf 0
  4032.  
  4033.     <ALT-E>    - Lädt  das Register  ES mit dem Inhalt von SE und das
  4034.                  Register DI mit dem Inhalt von OF
  4035.  
  4036.     <ALT-D>    - Lädt das  Register DS mit dem Inhalt von  SE und das
  4037.                  Register SI mit dem Inhalt von OF
  4038.  
  4039.     <ALT-C>    - Lädt den Eingabepuffer mit der Befehlszeile
  4040.  
  4041.                       MOV ES,SE ^ MOV DI,OF ^ MOV DS,FS ^ MOV SI,OF ^ C
  4042.  
  4043.                  Die  Befehlszeile wird aber NICHT sofort ausgeführt.
  4044.  
  4045.     <ALT-M>    - Diese Taste dient als Macro für die Befehlszeile
  4046.  
  4047.                       MOV ES,SE ^ MOV DI,OF ^ MOV DS,FS ^ MOV SI,OF
  4048.  
  4049.                  Diese wird sofort ausgeführt.
  4050.  
  4051.     <ALT-X>    - Verlassen von MDEBUG, Neustart im Interpreter
  4052.  
  4053.     <ALT-Q>    - Verlassen von  MDEBUG mit automatischem Aufruf von
  4054.                  MDEBUG sobald DOS nicht aktiv ist.
  4055.  
  4056.  
  4057.  
  4058.  
  4059.  
  4060.  
  4061.  
  4062.  
  4063.  
  4064.  
  4065.  
  4066.  
  4067.  
  4068.  
  4069.  
  4070.  
  4071.  
  4072.  
  4073.  
  4074.  
  4075.  
  4076.  
  4077.  
  4078.  
  4079.     ────────────────────────────────────────────────────────────────────────────────
  4080.                                                                         Seite   63
  4081.  
  4082.  
  4083.  
  4084.     Programm-Interna der Treiber
  4085.     ────────────────────────────
  4086.  
  4087.     Für alle Treiber gilt folgendes:
  4088.  
  4089.     Das Environment der Treiber wird wieder freigegeben.
  4090.     Damit Programme zur Ausgabe der Speicherbelegung den Besitzer des
  4091.     Speicherblocks der Treiber aber trotzdem  finden können, wird der
  4092.     Programmname des Treibers im  MCB ab dem  Offset 08h eingetragen.
  4093.     Dieser  Speicherbereich  ist bei DOS-Versionen bis 3.3  inclusive
  4094.     ungenutzt;  ab  DOS-Version 4.0 wird hier vom  DOS  ebenfalls der
  4095.     Name des Besitzer des Speicherblocks eingetragen. Da das Programm
  4096.     seinen Namen aus dem eigenen Environment ermittelt, ist  der Name
  4097.     im MCB immer mit dem Namen der .COM-Datei identisch.
  4098.  
  4099.     Bei der  Erstellung einer  neuen Version  über den Parameter '/I'
  4100.     wird immer der Original-Name des Treibers verwendet.
  4101.     Für die Kennung der Treiber  wird ebenfalls  immer der  Original-
  4102.     Name der Treiber verwendet.
  4103.  
  4104.     Vor dem  Installieren eines  Treibers werden alle offenen Handles
  4105.     geschlossen.
  4106.  
  4107.     Alle Ausgaben des transienten Teils der Treiber erfolgen über die
  4108.     DOS-Funktion zum  Schreiben über Handles. Voreingestelltes Handle
  4109.     hierfür ist STDOUT d.h. der Bildschirm. Sollte  das Schreiben auf
  4110.     das Handle  STDOUT nicht  möglich sein (z.B. durch die  Umleitung
  4111.     der  Standard-Ausgabe in eine Datei  auf einer  vollen Diskette),
  4112.     erfolgen  alle  Ausgaben über das Handle STDERR. Sollte auch dies
  4113.     nicht möglich sein, werden die Bildschirmausgaben unterdrückt.
  4114.  
  4115.     Während der Installation und Deinstallation ist der Abbruch eines
  4116.     Treibers über <CTRL-BREAK> oder <CTRL-C> nicht möglich.
  4117.  
  4118.     Alle Treiber,  die Dateien lesen oder schreiben verwenden hierfür
  4119.     die  DOS-Funktion  zum  Bearbeiten  von  Dateien und Geräten über
  4120.     Handles.  Da  das PSP von  den  Treibern  nicht  umgesetzt  wird,
  4121.     benutzen sie im residenten Teil  für diese Funktionen das PSP des
  4122.     unterbrochenen Prozesses.
  4123.     Bei der Erstellung von Dateien und beim Drucken werden auch Hard-
  4124.     ware-Fehler abgefangen. Hierfür wird der Interrupt 24h (temporär)
  4125.     auf eine eigene Routine umgesetzt, die nur den Code 3 (= Funktion
  4126.     abbrechen) zurück gibt.
  4127.     Die Break-Tasten  (<CTRL-C>, <CTRL-2>,  <CTRL-ScrollLock>) werden
  4128.     schon von MDEBUG abgefangen.
  4129.  
  4130.  
  4131.  
  4132.  
  4133.  
  4134.  
  4135.  
  4136.  
  4137.  
  4138.  
  4139.     ────────────────────────────────────────────────────────────────────────────────
  4140.                                                                         Seite   64
  4141.  
  4142.  
  4143.  
  4144.     Falls es nicht  ausdrücklich in der Dokumentation zu den Treibern
  4145.     angegeben ist,  verwenden die Treiber weder DOS- noch BIOS-Inter-
  4146.     rupts.
  4147.  
  4148.     Alle  Bildschirmausgaben  des  residenten  Teils  eines  Treibers
  4149.     werden direkt in  den Bildschirmspeicher geschrieben. Unterstützt
  4150.     werden alle Text-Modi mit mindestens 80 Spalten und 25 Zeilen.
  4151.  
  4152.     Jeder  Treiber  benutzt  einen eigenen Stack. Dieser überschreibt
  4153.     das PSP der Treiber. Teilweise wird das PSP von den Treibern auch
  4154.     noch für Variablen des residenten Teils benutzt.
  4155.  
  4156.     Falls ein Treiber Eingaben  über die Tastatur benötigt,  erwartet
  4157.     er für die Tasten die in der  Dokumentation zu MDEBUG angegebenen
  4158.     Codes.  Da  für  das  Lesen  von Eingaben  über die  Tastatur die
  4159.     interne  Routine von  MDEBUG verwendet  wird,  können die Treiber
  4160.     auch über das Util CALLMDB gesteuert werden.
  4161.  
  4162.  
  4163.  
  4164.     Errorlevel der Treiber
  4165.     ──────────────────────
  4166.  
  4167.     Die Treiber geben folgende Errorlevel zurück:
  4168.  
  4169.     ┌────────────┬──────────────────────────────────────────────────┐
  4170.     │ Errorlevel │ Bedeutung                                        │
  4171.     ╞════════════╪══════════════════════════════════════════════════╡
  4172.     │     0      │ Installation/Deinstallation okay                 │
  4173.     │     1      │ nur Hilfstext ausgegeben                         │
  4174.     │     2      │ neue Version des Treibers erstellt               │
  4175.     │   255      │ Fehler bei der Installation/Deinstallation       │
  4176.     └────────────┴──────────────────────────────────────────────────┘
  4177.  
  4178.  
  4179.  
  4180.  
  4181.  
  4182.  
  4183.  
  4184.  
  4185.  
  4186.  
  4187.  
  4188.  
  4189.  
  4190.  
  4191.  
  4192.  
  4193.  
  4194.  
  4195.  
  4196.  
  4197.  
  4198.  
  4199.     ────────────────────────────────────────────────────────────────────────────────
  4200.                                                                         Seite   65
  4201.  
  4202.  
  4203.  
  4204.     Fehlermeldungen des transienten Teils der Treiber
  4205.     ─────────────────────────────────────────────────
  4206.  
  4207.     Bei der Installation und der Deinstallation eines Treibers können
  4208.     folgende Fehler auftreten:
  4209.     (Hinweis: MDxxxDRV steht für den Namen des Treibers)
  4210.  
  4211.  
  4212.     ■ Warnung: Schreiben auf die Standard-Ausgabe nicht möglich!
  4213.                Gebe alle Meldungen über das Error-Handle aus.
  4214.  
  4215.     Alle Meldungen des transienten Teils der Treiber werden normaler-
  4216.     weise  über die  DOS-Funktionen zur Dateibearbeitung über Handles
  4217.     auf die Standard-Ausgabe ausgegeben.
  4218.     Tritt hierbei ein Fehler auf, werden die obige  Fehlermeldung und
  4219.     alle weiteren Meldungen auf das Error-Handle ausgegeben.
  4220.     Sollte  die Ausgabe auf das Error-Handle auch nicht möglich sein,
  4221.     so  unterdrücken die  Treiber alle Meldungen.  Die Funktionsweise
  4222.     der Treiber wird  davon aber nicht beeinträchtigt, d.h. bei  Auf-
  4223.     tritt  dieses  Fehlers erfolgt  kein Programmabbruch. Der  Fehler
  4224.     tritt normalerweise  nur auf, falls die Standard-Ausgabe über die
  4225.     Ausgabe-Umleitung von DOS in eine Datei auf einer vollen Diskette
  4226.     gelenkt wird.
  4227.  
  4228.  
  4229.     Jeder der folgenden Fehler  führt  zum  sofortigen Abbruch  eines
  4230.     Treibers:
  4231.  
  4232.  
  4233.     ■ Falsche DOS-Version! MDxxxDRV benötigt DOS-Version 3.0 oder höher!
  4234.  
  4235.       In diesem Fall kann kein  Errorlevel zurück  gegeben werden, da
  4236.       der Treiber über den Interrupt 20h beendet wird.
  4237.       Diese  Meldung wird als einzige über die Funktion 9h des Inter-
  4238.       rupt 21h ausgegeben.
  4239.  
  4240.  
  4241.     ■ Fehler: MDxxxDRV konnte nicht installiert werden!
  4242.  
  4243.       Falls  keine weitere  Meldung zur  Erläuterung  des Fehlers mit
  4244.       ausgegeben wird, konnte der Treiber aus einem unbekannten Grund
  4245.       nicht installiert werden.
  4246.  
  4247.  
  4248.  
  4249.  
  4250.  
  4251.  
  4252.  
  4253.  
  4254.  
  4255.  
  4256.  
  4257.  
  4258.  
  4259.     ────────────────────────────────────────────────────────────────────────────────
  4260.                                                                         Seite   66
  4261.  
  4262.  
  4263.  
  4264.     ■ Fehler: Zuwenig Speicher vorhanden!
  4265.  
  4266.     oder
  4267.  
  4268.     ■ DOS-Fehler bei der Speicherverwaltung aufgetreten:
  4269.       0008h - Zuwenig Speicher vorhanden!
  4270.  
  4271.       Der Treiber konnte nicht installiert werden, da zu wenig freier
  4272.       Speicher vorhanden ist.
  4273.       Vor  einem neuen  Versuch zum  Installieren  sollte  zuerst der
  4274.       freie Speicher vergrößert  werden, z.B. durch das Entfernen von
  4275.       anderen TSRs.
  4276.  
  4277.  
  4278.     ■ Fehler: Angegebene Prozessnummer wird schon von einem
  4279.               anderen Programm benutzt!
  4280.  
  4281.       Der Treiber konnte nicht installiert werden,  da die angegebene
  4282.       Prozessnummer  (oder  die  voreingestellte Prozessnummer) schon
  4283.       von einem anderen Programm benutzt wird.
  4284.       In  diesem Fall muß  über den  Parameter  '/Pnn'  die  korrekte
  4285.       Prozessnummer angegeben werden.
  4286.  
  4287.       Da eine falsche Prozessnummer für MDEBUG das System zum Absturz
  4288.       bringen  kann,  sollte  auf  jeden  Fall das Kapitel  über  die
  4289.       Prozessnummer in der Dokumentation zu MDEBUG beachtet werden!
  4290.  
  4291.  
  4292.     ■ Fehler: Treiber schon installiert!
  4293.               Alle Treiber wurde nur neu initialisiert.
  4294.  
  4295.       Jeder Treiber kann nur einmal installiert werden.
  4296.       Zur Deinstallation eines Treibers muß  der Parameter '/R' ange-
  4297.       geben werden.
  4298.  
  4299.  
  4300.     ■ Fehler: Treiber noch nicht installiert!
  4301.  
  4302.       Der Parameter '/R' ist  nur bei einem Aufruf zum Deinstallieren
  4303.       eines Treibers möglich.
  4304.  
  4305.  
  4306.  
  4307.  
  4308.  
  4309.  
  4310.  
  4311.  
  4312.  
  4313.  
  4314.  
  4315.  
  4316.  
  4317.  
  4318.  
  4319.     ────────────────────────────────────────────────────────────────────────────────
  4320.                                                                         Seite   67
  4321.  
  4322.  
  4323.  
  4324.     ■ Fehler: MDxxxDRV konnte nicht deinstalliert werden,
  4325.               da es nicht das letzte Programm in der Interruptkette
  4326.               für den Interrupt 2Fh ist!
  4327.               Treiber wurde neu initialisiert.
  4328.  
  4329.       Nach der Installierung des  Treibers wurde  noch mindestens ein
  4330.       Programm geladen, daß  ebenfalls den Interrupt 2Fh umbiegt. Vor
  4331.       einem weiteren Versuch zum  Deinstallieren des  Treibers müssen
  4332.       erst  alle nach dem Treiber geladenen Programme, die den Inter-
  4333.       rupt 2Fh umsetzen aus dem Speicher entfernt werden.
  4334.  
  4335.  
  4336.     ■ Fehler beim Löschen von MDxxxDRV.BAK!
  4337.     ■ Fehler beim umbenennen von MDxxxDRV.COM in MDxxxDRV.BAK!
  4338.     ■ Fehler beim Erstellen von MDxxxDRV.COM!
  4339.  
  4340.       Beim Erstellen einer neuen Version des Treibers trat ein Fehler
  4341.       auf.
  4342.  
  4343.  
  4344.     Die  folgenden  Fehler können  bei der  Installation und  bei der
  4345.     Deinstallation eines Treibers auftreten.
  4346.     Falls  einer  der Fehler  auftritt,  ist  sehr wahrscheinlich die
  4347.     Speicherverwaltung von DOS  zerstört. Daher sollte das System neu
  4348.     gebootet werden.
  4349.  
  4350.  
  4351.     ■ DOS-Fehler bei der Speicherverwaltung aufgetreten:
  4352.       0007h - Speichersteuerblock zerstört
  4353.  
  4354.     ■ DOS-Fehler bei der Speicherverwaltung aufgetreten:
  4355.       0009h - Ungültiger Speicherbereich!
  4356.  
  4357.     ■ DOS-Fehler bei der Speicherverwaltung aufgetreten:
  4358.       nnnnh - Unbekannter Fehler!
  4359.       (nnnn = DOS-Fehlernummer)
  4360.  
  4361.  
  4362.     Jeder  Treiber kann zusätzlich noch  weitere  Fehlermeldungen für
  4363.     den transienten  Teil (im allgemeinen für weitere Parameter) ent-
  4364.     halten.
  4365.  
  4366.  
  4367.  
  4368.  
  4369.  
  4370.  
  4371.  
  4372.  
  4373.  
  4374.  
  4375.  
  4376.  
  4377.  
  4378.  
  4379.     ────────────────────────────────────────────────────────────────────────────────
  4380.                                                                         Seite   68
  4381.  
  4382.  
  4383.  
  4384.  
  4385.  
  4386.  
  4387.  
  4388.  
  4389.  
  4390.  
  4391.  
  4392.  
  4393.  
  4394.  
  4395.  
  4396.  
  4397.  
  4398.  
  4399.  
  4400.  
  4401.  
  4402.  
  4403.  
  4404.  
  4405.  
  4406.  
  4407.  
  4408.  
  4409.  
  4410.  
  4411.  
  4412.  
  4413.  
  4414.  
  4415.  
  4416.  
  4417.  
  4418.  
  4419.  
  4420.  
  4421.  
  4422.  
  4423.  
  4424.  
  4425.  
  4426.  
  4427.  
  4428.  
  4429.  
  4430.  
  4431.  
  4432.  
  4433.  
  4434.  
  4435.  
  4436.  
  4437.  
  4438.  
  4439.     ────────────────────────────────────────────────────────────────────────────────
  4440.                                                                         Seite   69
  4441.